SOS! HELP!

 
Привет форумчане! Помогите разобраться: написал вот такую функцию
void MartinOrder()
  {
   datetime t=0;
   int ticket1=0,j=-1,i;
   for(i=0;i<OrdersHistoryTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic&&t<OrderCloseTime())
           {
               t=OrderCloseTime();
               j=i;
           }
        }
     }
   if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY))
   {
      if(OrderType()==OP_BUY)
        {
         if((OrderProfit()+OrderCommission()+OrderSwap())<0&&OrdersTotal()==0)
           {
            ticket1=OrderSend(Symbol(),OP_SELL,OrderLots()*Multiplier,Bid,slippage,Ask+SL,Ask-TP,CommentOrder,magic,0,Red);
            if(ticket1<0)
              {
                Print("Ошибка открытия Селл ордера по Мартину = ",GetLastError());
              }
           }
        }
      if(OrderType()==OP_SELL)
        {
         if((OrderProfit()+OrderCommission()+OrderSwap())<0&&OrdersTotal()==0)
           {
            ticket1=OrderSend(Symbol(),OP_BUY,OrderLots()*Multiplier,Ask,slippage,Bid-SL,Bid+TP,CommentOrder,magic,0,Blue);
            if(ticket1<0)
              {
                Print("Ошибка открытия Бай ордера по Мартину = ",GetLastError());
              }
           }
         }
       }
     }  
но почему-то она работает только в тестере! Пробовал на демо аккаунте - не работает! Где собака зарыта?
 
Maksim Neimerik:
Привет форумчане! Помогите разобраться: написал вот такую функциюно почему-то она работает только в тестере! Пробовал на демо аккаунте - не работает! Где собака зарыта?

А словами можно описать, что требуется и в чем проявляется нерабостоспособность онлайн?

По коду выходит так, что в первом цикле находится ордер по текущему символу с заданным магиком и наибольшим временем закрытия. То есть последний закрытый ордер. Если такой ордер найден, то открывается противоположный ордер с объемом, умноженным на Multiplier.

И точно советник работает на счете один и не открываются ордера вручную? Ведь вот это условие "некрасивое":

if((OrderProfit()+OrderCommission()+OrderSwap())<0&&OrdersTotal()==0)
 
Maksim Neimerik:
 Где собака зарыта?

1. история в терминале сколько дней? (правой мышей в терминале в окне истории ордеров)

2. нет нормализации лота

3. нет нормализации цен при открытии ордера

4. нет обработки ситуации "нет ордера в истории"

ЗЫ: я обычно такие задачи разбиваю на несколько этапов:

- пишу функцию поиска последнего ордера, которая вернет объем и тип последнего ордера (можно в качестве флага убытка вернуть отрицательную величину, если был прибыльный ордер - то вернуть положительный обьем ордера)

- выставляю ордер в соответсвии с логикой ТС

Пользовательский интерфейс - Начало работы - MetaTrader 5
Пользовательский интерфейс - Начало работы - MetaTrader 5
  • www.metatrader5.com
Интерфейс платформы предоставляет доступ ко всем инструментам, необходимым для торговли на финансовых рынках. Он включает в себя различные меню, панели инструментов и служебные окна. Главное меню В главном меню собраны практически все команды и функции, которые можно выполнять в торговой платформе. Оно позволяет работать с графиками...
 
Ihor Herasko:

А словами можно описать, что требуется и в чем проявляется нерабостоспособность онлайн?

По коду выходит так, что в первом цикле находится ордер по текущему символу с заданным магиком и наибольшим временем закрытия. То есть последний закрытый ордер. Если такой ордер найден, то открывается противоположный ордер с объемом, умноженным на Multiplier.

Все верно, так и есть. Но не могу понять почему на демо не работает....

 
Maksim Neimerik:

Все верно, так и есть. Но не могу понять почему на демо не работает....

Вот это

OrdersHistoryTotal()

требует сначала ручками выбрать период отражения закрытых ордеров

 
Igor Makanu:

1. история в терминале сколько дней? (правой мышей в терминале в окне истории ордеров)

2. нет нормализации лота

3. нет нормализации цен при открытии ордера

4. нет обработки ситуации "нет ордера в истории"

ЗЫ: я обычно такие задачи разбиваю на несколько этапов:

- пишу функцию поиска последнего ордера, которая вернет объем последнего ордера (можно в качестве флага убытка вернуть отрицательную величину, если был прибыльный ордер - то вернуть положительный обьем ордера)

- выставляю ордер в соответсвии с логикой ТС

но ведь разбирать на этапы не обязательно... По поводу нормализации - спасибо за подсказку, я обязательно поправлю, но все же проблема не в этом. Я тупо не могу понять почему в тестере работает а на демо - нет!

 
Maksim Neimerik:

Все верно, так и есть. Но не могу понять почему на демо не работает....

Впишите в начале OnTick() такую строчку: Comment("Orders total: ",OrdersTotal()). Если там не ноль, и на текущем символе нет открытых позиций и выставленных ордеров - значит есть на другом символе ордер или позиция. Соответственно, и открываться новые позиции не будут. Ну или уберите из условий открытия позиций такую грубую проверку на количество ордеров на счёте - сделайте проверку на количество открытых позиций по символу.

Впрочем, Игорь вам уже указывал на эту вашу не очень корректную проверку. Но вы промолчали на этот счёт.

 
Maksim Neimerik:

но ведь разбирать на этапы не обязательно... По поводу нормализации - спасибо за подсказку, я обязательно поправлю, но все же проблема не в этом. Я тупо не могу понять почему в тестере работает а на демо - нет!

1. в истории в терминале установите глубже период

2. где обработка условия, что нет в истории терминала ордера?

3. а что делать если есть в истории ордер, а он с профитом?

и Вам уже указали, что условие 

&&OrdersTotal()==0
не совсем корректное - а что  будет если в терминале открыт ордер даже руками?
 
Renat Akhtyamov:

Вот это

требует сначала ручками выбрать период отражения закрытых ордеров

тоесть вы хотите сказать что просто нужно сделать вот так:
 
Maksim Neimerik:
тоесть вы хотите сказать что просто нужно сделать вот так:

да

потом пойдем дальше, если не заработает

 
Всем большое спасибо! Действительно проблема была в этом:
OrdersTotal()==0
Должен был сам заметить, но наверное заработался....
Причина обращения: