Ваши вопросы по языку MQL4

Александр_Стручков

Интересующийся
ошибка '{' - function definition unexpected

Всем привет! Начинаю писать свой первый скрипт, и первая проблема - метаэдитор ругается на запятые при перечислении выражений"," в операторе IF
Кто знает, в чем проблема? ;)
#property strict уже убрал - без результатов.
Заранее благодарен за помощь :)

В мануале написано, что перечислять можно через запятую. Или я что-то не так понял?
Не хочется писать несколько операторов "If" для каждого выражения, если все можно написать в одном..

На данной стадии код выглядит так:

extern int MaxRisk=2; // максимальный риск в % от депозита
extern int TP=90; // TakeProfit
extern int SL=35; // StopLoss
extern int TS=35; //
bool ordersell=false; // разрешение на открытие ордера на продажу
bool orderbuy=false; // разрешение на открытие ордера на покупку
double Lot=0; // Рассчитанное значение размера открытия позиции

void OnTick(void)
{
if(DayOfWeek()==0 || DayOfWeek()==6) return(0); // в выходные не работаем
if(!IsTradeAllowed()) return(0); // пропустим тик если терминал занят

double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
Lot =MathFloor(Free*MaxRisk/100/One_Lot/Step)*Step;
if(Lot>Max_Lot) Lot=Max_Lot;// размер лота не превышает максимально разрешенный
if(Lot<Min_Lot) orderbuy=false, ordersell=false, Alert("Не достаточно средств для совершения операции согласно заданным условиям риска");
return;
}
 
Последнее редактирование:

qqmber

Почетный гражданин
В мануале написано, что перечислять можно через запятую. Или я что-то не так понял?
Это где такое написано?
Выражения разделяются точкой с запятой ;
Простой запятой разделяются аргументы функций, не считая еще кое-какой экзотики.
Ваш фрагмент должен выглядеть примерно так:
Код:
if(Lot<Min_Lot) {orderbuy=false; ordersell=false; Alert("Не достаточно средств для совершения операции согласно заданным условиям риска");}
 

ctmcn

Новичок форума
AlexeyVik
Подскажите, если не трудно, почему на некоторых валютных парах наблюдается не полное заполнение гистограмой индикатора своего окна. Должно быть мин.0-1макс. полностью, а, например, на USDCHF - 0-0,95. Чтобы не изменять вручную границу максимума, какой параметр в коде за это отвечает ?
P.S. Индикатор прикреплял выше "Bollinger Band Stop..."
С уважением.
 

AlexeyVik

Программист mql4 mql5
AlexeyVik
Подскажите, если не трудно, почему на некоторых валютных парах наблюдается не полное заполнение гистограмой индикатора своего окна. Должно быть мин.0-1макс. полностью, а, например, на USDCHF - 0-0,95. Чтобы не изменять вручную границу максимума, какой параметр в коде за это отвечает ?
P.S. Индикатор прикреплял выше "Bollinger Band Stop..."
С уважением.
Посмотри indicator_maximum http://docs.mql4.com/ru/basis/preprosessor/compilation
Если не то что надо я посмотрю позже повнимательней.
 

ctmcn

Новичок форума
Посмотри indicator_maximum http://docs.mql4.com/ru/basis/preprosessor/compilation
Если не то что надо я посмотрю позже повнимательней.

Я сейчас вручную ставлю 0.1 и 0.9 для мин. и макс.
Прописать в коде эти значения - не совсем правильно будет. Надо найти причину.
А что значат значения в коде:
int start()
{
int shift,trend;
double smax[25000],smin[25000],bsmax[25000],bsmin[25000];
P.S. Я под себя правлю индикаторы - значения, цвета, уровни, выбросить лишнее и т.п. Со временем много стало понятным, но не все...:)
 

AlexeyVik

Программист mql4 mql5
Я сейчас вручную ставлю 0.1 и 0.9 для мин. и макс.
Прописать в коде эти значения - не совсем правильно будет. Надо найти причину.
А что значат значения в коде:
int start()
{
int shift,trend;
double smax[25000],smin[25000],bsmax[25000],bsmin[25000];
P.S. Я под себя правлю индикаторы - значения, цвета, уровни, выбросить лишнее и т.п. Со временем много стало понятным, но не все...:)
Это объявлены переменные и 4 пользовательских массива, правда для чего они я так и не понял вполне можно было обойтись без них.
Вот подправил как понял тебя.
 

Вложения

  • Bollinger Bands_Stop_v1.mq4
    6,4 КБ · Просмотры: 26

Bob5

Новичок форума
Здравствуйте. Если кто то знает, как обозначить
последнию точку соприкосновения линии
индикатора MA (Moving Average ) - с ценой,
так сказать MA == Bid, чтоб от нее начинать
отсчет. Просьба подсказать.
 

Ugar

Гуру форума
Здравствуйте. Если кто то знает, как обозначить
последнию точку соприкосновения линии
индикатора MA (Moving Average ) - с ценой,
так сказать MA == Bid, чтоб от нее начинать
отсчет. Просьба подсказать.
1. Нельзя сравнивать МА и цену на ==. Значение МА чаще всего будет между пунктами. Значит цена почти всегда пробивает МА.
2. Нельзя сравнивать double переменные на ==. Из за погрешностей будет работать нестабильно.
Честно говоря, из описания, я не понял для каких целей надо, нет подробностей.
В общем, если надо фиксировать в реальном времени, нужно сравнивать МА с ценой на последних тиках. Пробой сверху вниз на прошлом тике цена была больше МА, на текущем тике меньше или равно. Пробой снизу вверх наоборот.
 
  • Like
Реакции: Bob5

Александр_Стручков

Интересующийся
В чем различие?

Всем доброго времени! Не сочтите за глупого, я еще только учусь:)
На этом сайте нашел скрипт на закрытие всех открытых ордеров. Его код мне показался слишком громоздким и, конечно же, не понятным, т.к. я только начинаю изучать данный язык.

Написал свой код более простой. Проверил - работает. Прошу опытных людей ответить, в чем разница, если оба скрипта в итоге просто закрывают все открытые ордеры? Заранее спасибо за ответ.

Код моего скрипта
PHP:
#property copyright
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
int i=OrdersTotal();
 for(i--;i>=0;i--)
   {OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
   if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),3,CLR_NONE);
   if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),3,CLR_NONE);
   Sleep(100);
   }
  }
//+------------------------------------------------------------------+


Скрипт с этого сайта

PHP:
//+------------------------------------------------------------------+
//|                                               CloseAllOrders.mq4 |
//|                       Copyright © 2008, PRMQuotes Software Corp. |
//|                                           [email protected]  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, PRMQuotes Software Corp."
#property link      ""
//+------------------------------------------------------------------+
//| EX4 imports                                                      |
//+------------------------------------------------------------------+
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| global variables to program:                                     |
//+------------------------------------------------------------------+
double Price[2];
int    giSlippage;
bool   CloseOpenOrders = true;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start() {
  int iOrders=OrdersTotal()-1, i;
  
  if(CloseOpenOrders) {
    for(i=iOrders; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() && !OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],giSlippage)) Print(OrderError());
    }
  }
}
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError() {
  int iError=GetLastError();
  return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError)));
}
//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo() {
  RefreshRates();
  Price[0]=MarketInfo(OrderSymbol(),MODE_ASK);
  Price[1]=MarketInfo(OrderSymbol(),MODE_BID);
  double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
  if(dPoint==0) return(false);
  giSlippage=(Price[0]-Price[1])/dPoint;
  return(Price[0]>0.0 && Price[1]>0.0);
}
//+------------------------------------------------------------------+
 

qqmber

Почетный гражданин
Написал свой код более простой. Проверил - работает. Прошу опытных людей ответить, в чем разница, если оба скрипта в итоге просто закрывают все открытые ордеры? Заранее спасибо за ответ.

Нет особой разницы. Точно такой же новичок тренировался код писать, только он себе задачу не ставил сделать кратко, а хотел проскальзывание спредом ограничить. Это не образец правильного кода, таких тут на сайте море.
Смотрите стиль кодирования индикаторов и советников из комплекта к терминалу. Там во всяком случае профи писали, если и не идеально, то без больших глупостей.

PS Большие простыни кода сворачивайте тегами SPOILER
 
Последнее редактирование:

Александр_Стручков

Интересующийся
qqmber, спасибо за очередной ответ!

Начинаю понимать, что в программировании - как в разговоре - главное выразить мысль, а как выразить - дело второстепенное. И стиль разговора у всех разный.. :)
 

tatianati

Активный участник
Здравствуйте.
Помогите.
Переставляю сетку разнонаправленных лимитных ордеров вслед за изменением показаний индикатора по low/high.
Подскажите, как проверку написать, чтобы если один лимитный ордер стал рыночным, остальные ордера того – же направления не переставлялись вслед за индикатором.
Вот так переставляю – переношу ордер на новый уровень.
PHP:
for(i=OrdersTotal()-1; i>=0; i--) 
    {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES));
    {
   	if(OrderMagicNumber()!=magic) continue; 
          if(OrderSymbol()!=Symbol())continue;    
        //пересчитываю количество ордеров:
        if(OrderType()==OP_BUY)      {op_b++; }  
        if(OrderType()==OP_SELL) 	{op_s++; }  
        if(OrderType()==OP_BUYLIMIT) 
   		{b_lm++; 
            if(low>0.2 && OrderOpenPrice()!=low) // какую проверку нужно?
              {//переношу лимитник на новый уровень
   			modify_limit_order(OP_BUYLIMIT, low);
                //Sleep(1000*10);              }
   		}
        if(OrderType()==OP_SELLLIMIT) 
   		{s_lm++; 
            if(high>0.2 && OrderOpenPrice()!=high)
              {//переношу лимитник на новый уровень
   			modify_limit_order(OP_SELLLIMIT, high);
                //Sleep(1000*10);   		
          }
       }
    }        
  }
 
Последнее редактирование:

Ugar

Гуру форума
Здравствуйте.
Помогите.
Переставляю сетку разнонаправленных лимитных ордеров вслед за изменением показаний индикатора по low/high.
Подскажите, как проверку написать, чтобы если один лимитный ордер стал рыночным, остальные ордера того – же направления не переставлялись вслед за индикатором.
Вот так переставляю – переношу ордер на новый уровень.
PHP:
for(i=OrdersTotal()-1; i>=0; i--) 
    {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES));
    {
       if(OrderMagicNumber()!=magic) continue; 
          if(OrderSymbol()!=Symbol())continue;    
        //пересчитываю количество ордеров:
        if(OrderType()==OP_BUY)      {op_b++; }  
        if(OrderType()==OP_SELL)     {op_s++; }  
        if(OrderType()==OP_BUYLIMIT) 
           {b_lm++; 
            if(low>0.2 && OrderOpenPrice()!=low) // какую проверку нужно?
              {//переношу лимитник на новый уровень
               modify_limit_order(OP_BUYLIMIT, low);
                //Sleep(1000*10);              }
           }
        if(OrderType()==OP_SELLLIMIT) 
           {s_lm++; 
            if(high>0.2 && OrderOpenPrice()!=high)
              {//переношу лимитник на новый уровень
               modify_limit_order(OP_SELLLIMIT, high);
                //Sleep(1000*10);           
          }
       }
    }        
  }
Перед этим циклом с модификацией отложек надо написать ещё один цикл с обнаружением сработавших. Если сработавшие есть, цикл с модификацией можно не выполнять.
 

Red13

Новичок форума
Здравствуйте, помогите пожалуйста выбрать максимум, минимум из 3х элементов не используя массивы.:please:
Конкретнее самую длинную свечу из 3х последних.
 
Последнее редактирование:

Александр_Стручков

Интересующийся
Доброго времени всем! Пишу аналог трейлинг-стопа. Проблема такая: нужно узнать, было ли изменение стоп-лосса у открытого ордера. Как правильно описать условие проверки?

Описал функцию поочередного перебирания открытых ордеров и т.д.
Далее проверяем, изменялся ли стоп-лосс (SL-значение стоплосса в пунктах, которое мы устанавливаем каждому ордеру по стратегии):

Код:
if (OrderStopLoss()==OrderOpenPrice()+SL*Point)

И каждый раз условие срабатывает как не верное, не пойму почему..:facepalm:

Есть предположение, что нужно учитывать спред.. Но как его учтешь, если он плавающий?
 
Последнее редактирование:

Ugar

Гуру форума
Здравствуйте, помогите пожалуйста выбрать максимум, минимум из 3х элементов не используя массивы.:please:
Конкретнее самую длинную свечу из 3х последних.
Простой способ:
Код:
double b=0;
uchar a, n=0;
for(a=0; a<3; a++)
{
if(b<High[a]-Low[a])
{
n=a;
b=High[a]-Low[a];
}}
В n будет номер самого длинного бара.
 

qqmber

Почетный гражданин
Код:
if (OrderStopLoss()==OrderOpenPrice()+SL*Point)
Величины с плавающей точкой нельзя сравнивать на равенство, поскольку они хранятся округленными до ближайшей степени двойки. Попробуйте так
Код:
if (MathAbs(OrderStopLoss() - OrderOpenPrice()+SL*Point) < Point)
В stdlib есть функция CompareDoubles, можно ее использовать.
 
Последнее редактирование:
Верх