Проблема с открытием противоположного ордера!

 

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

bool MartinOrder()
{
datetime t=0;
{
   for(int i=0; i<=OrdersHistoryTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderSymbol()==Symbol())
         {
            if(OrderType()==OP_BUY)
            {
               if(OrderMagicNumber()==Magic1)           
               {
                  if(OrderProfit()<0)
                  {
                     if(t<OrderCloseTime())
                        t=OrderCloseTime();return(t);
                     {
                        if(t==OrderCloseTime())
                        if(OrderSend(NULL,OP_SELL,(OrderLots()*2),Bid,Slippage,OrderOpenPrice(),(Bid-(OrderOpenPrice()-Bid)),"MartinSell",Magic3,0,Red))
                        Print("MartinSell");  
                     }
                  }
               }
            }
         }
      }
   }
 }
 return(true);
}
 
Maksim Neimerik:

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

bool MartinOrder()
{
datetime t=0;
{
   for(int i=0; i<=OrdersHistoryTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderSymbol()==Symbol())
         {
            if(OrderType()==OP_BUY)
            {
               if(OrderMagicNumber()==Magic1)           
               {
                  if(OrderProfit()<0)
                  {
                     if(t<OrderCloseTime())
                        t=OrderCloseTime();return(t);
                     {
                        if(t==OrderCloseTime())
                        if(OrderSend(NULL,OP_SELL,(OrderLots()*2),Bid,Slippage,OrderOpenPrice(),(Bid-(OrderOpenPrice()-Bid)),"MartinSell",Magic3,0,Red))
                        Print("MartinSell");  
                     }
                  }
               }
            }
         }
      }
   }
 }
 return(true);
}
А что вы предпринимаете, чтобы открывался один ордер, а не пачка?
 
khorosh:
А что вы предпринимаете, чтобы открывался один ордер, а не пачка?
я до этого еще не дошел)) у меня вообще ничего не открывается!!! Скорее всего буду по магику (Magic3) проверять на наличие...
 
Maksim Neimerik:
я до этого еще не дошел)) у меня вообще ничего не открывается!!! Скорее всего буду по магику (Magic3) проверять на наличие...
А в журнале какое-нибудь сообщение об ошибке есть?
 
khorosh:
А в журнале какое-нибудь сообщение об ошибке есть?
Пусто, я уже думал что вызываю функцию неправильно но нет... функция постоянно возвращает значение true...
 

Ошибки в вашей функции. Посмотрите как сделано у KimIV. Я давал вам функцию. У него сначала находится индекс(порядковый номер в списке закрытых ордеров) последней закрытой позиции. А потом уже по этому индексу выбирается этот ордер и у него проверяется if (OrderProfit()<0).

И не понятно зачем вы воткнули return(t); Функции типа bool будет возвращаться время и далее код выполняться не будет.

 
khorosh:

Ошибки в вашей функции. Посмотрите как сделано у KimIV. Я давал вам функцию. У него сначала находится индекс(порядковый номер в списке закрытых ордеров) последней закрытой позиции. А потом уже по этому индексу выбирается этот ордер и у него проверяется if (OrderProfit()<0).

И не понятно зачем вы воткнули return(t); Функции типа bool будет возвращаться время и далее код выполняться не будет.

Тоже правильно, спасибо щас еще попробую...
 
Maksim Neimerik:
Тоже правильно, спасибо щас еще попробую...
Там вместо return(t); наверно нужно continue; поставить...
 
Maksim Neimerik:
Там вместо return(t); наверно нужно continue; поставить...

Если хотите получить быстрый результат, используйте готовые функции KimIV. Лично я все эксперты строю на его функциях, подключаю к эксперту все его библиотеки и конструирую эксперт из кубиков-функций. Свою функцию делаю только, если  такой не находится в библиотеках KimIV. Это здорово экономит время. А время вам понадобится. Чтобы найти работающую идею, придётся перелопачивать их большое количество. Если вы используете стоплоссы и тейкпрофиты в вашем случае можно использовать функции KimIV.

// isCloseLastPosByStop     Флаг закрытия последней позиции по стопу

// isCloseLastPosByTake     Флаг закрытия последней позиции по тейку

 

Во первых, у вас полный бардак со скобками.

Во вторых - одного меджика более чем достаточно для решения вашей задачи.

Если не сильны в программировании - попробуйте написать логику по шагам на русском, многое станет понятно.

 
Aleksei Radchenko:

Во первых, у вас полный бардак со скобками.

Во вторых - одного меджика более чем достаточно для решения вашей задачи.

Если не сильны в программировании - попробуйте написать логику по шагам на русском, многое станет понятно.

В данной ситуации может и достаточно, но если смотреть на весь советник то нет, не хватит...

А что со собками то не так?))

Причина обращения: