ошибка в коде: прошу помощи

 

попробовал забить в код следующий алгоритм торговли спредом:

1) если % изменение по "базовому инструменту" за час больше, чем % изменение по usdchf:

продаем 0.1 лот по базовому инструменту и покупаем 0.1 лот по usdchf;

2) если % изменение по "базовому инструменту" за час меньше, чем % изменение по usdchf:

покупаем 0.1 лот по базовому инструменту и продаем 0.1 лот по usdchf;

3) сделки закрываем через 1 час (3600 секунд).

Результат теста кода вышел неадекватный алгоритму. Буду благодарен, если подскажите ошибку:

int start()
  {//---Открытие сделок----------------------------------------------
  int A, B, ticket_1, ticket_2;
  A = (iClose(NULL, PERIOD_H1,1) - iOpen(NULL, PERIOD_H1,1))/100*iOpen(NULL, PERIOD_H1,1); //% знач. измен-ия 
                                                                                           //основного инструмента
  B = (iClose("USDCHF", PERIOD_H1,1) - iOpen("USDCHF", PERIOD_H1,1))/100*iOpen("USDCHF", PERIOD_H1,1);//%знач. изм-ия usdchf
   if (A>B)
    {ticket_1 = OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"My order #",16384,0,Green);
     ticket_2 = OrderSend("USDCHF",OP_BUY,0.1,Ask,3,0,0,"My order #",16384,0,Green);
    }
   else
    {ticket_1 = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"My order #",16384,0,Green);
     ticket_2 = OrderSend("USDCHF",OP_SELL,0.1,Bid,3,0,0,"My order #",16384,0,Green);
    }
    
   //---Определение переменной С (цена Ask или Bid в блоке закрытия первой позиции) 
   string C;
   if(OrderSelect(ticket_1, SELECT_BY_TICKET)==true)
    {if(OrderType()==OP_BUY)
     C=Bid;
     else
     C=Ask;
    }
         
   //---Закрытие первой позиции-----------------------------------------------
    if(OrderSelect(ticket_1, SELECT_BY_TICKET)==true) 
    {
    if(OrderOpenTime()+3600>=TimeCurrent())
     OrderClose(ticket_1,0.1,C,3,Red);
    }
    
   //---Определение переменной D (цена Ask или Bid в блоке закрытия второй позиции) 
   string D;
   if(OrderSelect(ticket_2, SELECT_BY_TICKET)==true)
    {if(OrderType()==OP_BUY)
     D=Bid;
     else
     D=Ask;
    }
   
    //---Закрытие второй позиции-----------------------------------------------
    if(OrderSelect(ticket_2, SELECT_BY_TICKET)==true) 
    {
    if(OrderOpenTime()+3600>=TimeCurrent())
     OrderClose(ticket_1,0.1,C,3,Red);
    }
  return(0);
  }
 

Мне кажется, Вы знак не учитываете. Добавьте еще условия, когда цена вниз идет.

И при закрытии надо поменять условие

if(OrderOpenTime()+3600>=TimeCurrent())

на

if(OrderOpenTime()+3600<=TimeCurrent())

И нельзя просто вставлять Аск или Бид как строковую переменную

 
Roger:

Мне кажется, Вы знак не учитываете. Добавьте еще условия, когда цена вниз идет.

И при закрытии надо поменять условие

на

И нельзя просто вставлять Аск или Бид как строковую переменную


спасибо за ответ. принял к сведению.

как можно закодировать закрытие позиций через час? п.ч. даже с поправками сделки закрываются через 2-3 минуты.

 
eternal2:
спасибо за ответ. принял к сведению.

как можно закодировать закрытие позиций через час? п.ч. даже с поправками сделки закрываются через 2-3 минуты.

Хочется спросить: "А где Вы такую конструкцию кода видели?" И кто Вас научил вместо значения цены ставить строчку?! А пробовали ли перезагружать советник после открытия ордеров???
На вопрос: "А как надо?" - покопайтесь в кодобазе, и это не из *** побуждений, а потому, что структура кода ПОЛНОСТЬЮ неверна. А алгоритм кода (как один из вариантов жизнеспособного кода) может выглядеть так: Открываете ордера каждый со своим Магиком, затем отыскиваете в спитске ордеров свой (нужный) ордер и по условиям времени его закрываете.

Время можно контролировать и так:

int li_Shift = iBarShift (Symbol(), PERIOD_H1, OrderOpenTime());
if (li_Shift >= 1) OrderClose ();
 
TarasBY:

Хочется спросить: "А где Вы такую конструкцию кода видели?" И кто Вас научил вместо значения цены ставить строчку?! А пробовали ли перезагружать советник после открытия ордеров???
На вопрос: "А как надо?" - покопайтесь в кодобазе, и это не из *** побуждений, а потому, что структура кода ПОЛНОСТЬЮ неверна. А алгоритм кода (как один из вариантов жизнеспособного кода) может выглядеть так: Открываете ордера каждый со своим Магиком, затем отыскиваете в спитске ордеров свой (нужный) ордер и по условиям времени его закрываете.

Время можно контролировать и так:


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