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

MakarFX

Элитный участник
Это я понимаю. Но когда на подходящей свече наступает условия открытия открытия не пррисходит.
Условие на ступает позже, когда f_IsNewBar() = false.
Поменяйте алгоритм срабатывания f_IsNewBar(), чтобы он проверялся после открытия ордера.
 

MakarFX

Элитный участник
Это я понимаю. Но когда на подходящей свече наступает условия открытия открытия не пррисходит.
Пример для Вашего советника


C-подобный:
datetime newbar=0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(newbar!=Time[0])
     {
      if(OrdersTotal()==0 && Indi.Sar(1)< Open[0] && Indi.Sar(0)>Open[0])
        {
         Open_Sell(); newbar=Time[0];
        }
      if(OrdersTotal()==0 && Indi.Sar(1)> Open[0] && Indi.Sar(0)<Open[0])
        {
         Open_Buy(); newbar=Time[0];
        }
     }
   OrderModyfi(razmer_stopa(Magik),razmer_profita(Magik));
  }
 

star603

Новичок форума
Пример для Вашего советника


C-подобный:
datetime newbar=0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(newbar!=Time[0])
     {
      if(OrdersTotal()==0 && Indi.Sar(1)< Open[0] && Indi.Sar(0)>Open[0])
        {
         Open_Sell(); newbar=Time[0];
        }
      if(OrdersTotal()==0 && Indi.Sar(1)> Open[0] && Indi.Sar(0)<Open[0])
        {
         Open_Buy(); newbar=Time[0];
        }
     }
   OrderModyfi(razmer_stopa(Magik),razmer_profita(Magik));
  }
не работает
 

ИванМН

Местный знаток
Странно почему у меня только 1 сделку открывает понять не могу.
У Вас стоит два ограничения на открытие: контроль нового бара (newbar == Time[0]) и контроль открытых позиций (OrdersTotal() == 0). Пока открытая позиция не закроется, новая не откроется, даже на новом баре.
Модификацию позиции надо переставить в однократный блок. Зачем Вам на каждом тике двигать ТП и СЛ?
И ещё добрый совет, проверенный временем: никогда не сравнивайте дробные числа напрямую. Рекомендую в начале каждой программы вставлять макрос #define ND(a,b,c) NormalizeDouble((a) - (b),(c)) и в дальнейшем для этой цели пользоваться им, сравнивая нормализованную разницу a и b c каким-либо числом. Это позволит Вам избежать многих проблем с разницей результатов прогонов при одних и тех же исходных.
 

star603

Новичок форума
С мои сетом у Вас работает?
Тоже
У Вас стоит два ограничения на открытие: контроль нового бара (newbar == Time[0]) и контроль открытых позиций (OrdersTotal() == 0). Пока открытая позиция не закроется, новая не откроется, даже на новом баре.
Модификацию позиции надо переставить в однократный блок. Зачем Вам на каждом тике двигать ТП и СЛ?
И ещё добрый совет, проверенный временем: никогда не сравнивайте дробные числа напрямую. Рекомендую в начале каждой программы вставлять макрос #define ND(a,b,c) NormalizeDouble((a) - (b),(c)) и в дальнейшем для этой цели пользоваться им, сравнивая нормализованную разницу a и b c каким-либо числом. Это позволит Вам избежать многих проблем с разницей результатов прогонов при одних и тех же исходных.
скажите пожайлуйста можно на примере?
 

ИванМН

Местный знаток
скажите пожайлуйста можно на примере?
Вы о сравнении дробных? Пожалуйста.

Сравнение некоей переменной с нулём:

#define ND(a,b,c) NormalizeDouble((a) - (b),(c))

<...>

if (ND(LastOOP,0,2) > 0) /*а не if (LastOOP > 0). То есть из LastOOP вычитается второе число (в данном случае ноль), разница нормализуется третьим значением макроса и уже
этот результат сравнивается с нулём */
{
}

Сравнение двух переменных:

if (ND(MashB,LastOOP,2) > 0) /*а не if (MashB > LastOOP). Из MashB вычитается LastOOP, результат нормализуется (2 знака после запятой) и сравнивается с нулём */
{
}
 

star603

Новичок форума
У Вас стоит два ограничения на открытие: контроль нового бара (newbar == Time[0]) и контроль открытых позиций (OrdersTotal() == 0). Пока открытая позиция не закроется, новая не откроется, даже на новом баре.
Модификацию позиции надо переставить в однократный блок. Зачем Вам на каждом тике двигать ТП и СЛ?
И ещё добрый совет, проверенный временем: никогда не сравнивайте дробные числа напрямую. Рекомендую в начале каждой программы вставлять макрос #define ND(a,b,c) NormalizeDouble((a) - (b),(c)) и в дальнейшем для этой цели пользоваться им, сравнивая нормализованную разницу a и b c каким-либо числом. Это позволит Вам избежать многих проблем с разницей результатов прогонов при одних и тех же исходных.
1. У Вас стоит два ограничения на открытие: контроль нового бара (newbar == Time[0]) и контроль открытых позиций (OrdersTotal() == 0). Пока открытая позиция не закроется, новая не откроется, даже на новом баре.

Да это понимаю. Но когда позиция закрывается новая не открывается.

2. Модификацию позиции надо переставить в однократный блок. Зачем Вам на каждом тике двигать ТП и СЛ?

Чтобы это сделать у меня два варианта решения:
а) менять только на новом баре. (с этим проблемы)
б) либо также когда нет ордеров.
 

ИванМН

Местный знаток
Но когда позиция закрывается новая не открывается.
У Вас открытие позиции должно происходить при смене направления Параболика? Тогда почему во вторых условиях в 9 и 13 строках функция Indi.Sar снимает показания с первого бара, а сравнение происходит с ценой Open нулевого бара? Показание на первом баре надо сравнивать с Open на первом же баре, на нулевом - с Open на нулевом (на первом Параболик над ценой, на нулевом - под ней и наоборот).
 

star603

Новичок форума
У Вас открытие позиции должно происходить при смене направления Параболика? Тогда почему во вторых условиях в 9 и 13 строках функция Indi.Sar снимает показания с первого бара, а сравнение происходит с ценой Open нулевого бара? Показание на первом баре надо сравнивать с Open на первом же баре, на нулевом - с Open на нулевом (на первом Параболик над ценой, на нулевом - под ней и наоборот).
Спасибо исправил. Осталось только открытие нового бара наладить.
 

Отслеживают (499) Посмотреть

Верх