Прошу помощи у ГУРУ для новичка (потратил много времени ит ак не смог реализовать данную задачу)

 

Друзья, приветствую Вас и прошу помочь! Уже две или три недели как новичок читаю и смотрю видео, но не могу написать поставленную задачу, т.к. образуется уже каша в голове.

Задача: Открыть при запуске программы ордер "А" (Buy), далее открыть ордер "B" (Sell) по цене открытия ордера "А". Данная задача реализуется один раз при запуске программы, т.к. далее будут реализованы другие задачи. Благодарю за понимание!

 

//+------------------------------------------------------------------+

//|                                                      ProjectName |

//|                                      Copyright 2012, CompanyName |

//|                                       http://www.companyname.net |

//+------------------------------------------------------------------+

#property strict

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+


input double Lots    = 0.01;

input int TakeProfit = 150;

input int StopLoss   = 150;

input int  Magic     = 0;

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

int OnInit()

  {

  double b=0;

   double ice;

   if(b==0)

     {

      OrderSend(_Symbol,0,Lots,Ask,0,0,0,"",Magic,0,clrBlue);

      Print("Ордер BUY открыт!");

     }


   if(OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES)==true)

     {

      double ice=OrderOpenPrice();

      Print("Цена ордера BUY=",ice);


     }


int kce=0;

      while(kce==0 && RefreshRates()==false)

        {

        

         double bid=MarketInfo(_Symbol,MODE_BID);

         if(bid!=ice)

           {

            

            Print("Ордер  sell не открыт");

           }

         else

           {

            int kce=OrderSend(_Symbol,1,Lots,bid,0,0,0,"",Magic,0,clrRed);

            Print("Ура kce",kce);

            return(kce);

           }

          

        }


   return(0); 

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {


  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {


  }

//+------------------------------------------------------------------+

 

Первое, что бросается в глаза.

m8akca:
   "OrderSend(_Symbol,0,Lots,Ask,0,0,0,"",Magic,0,clrBlue); 

...

   if(OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES)==true)"


Тикет, равный 1, встретить в жизни не удавалось. Это не Ваш, а ДЦ-шный номер, и 1, если была использована, то давным-давно - эти номера всегда лишь увеличиваются. Чтобы OrderSelect выбрал ордер, надо как-то так:

Tic=OrderSend(...

if(OrderSelect(Tic,..

Следующее. int kce с переопределением типа переменной применяется два раза в одной функции, этот изыск языка С в данном случае совершенно излишен. После обновления по RefreshRates() значение kce меняется в int kce=OrderSend(_..., и какое значение будет проверяться в условии продолжения цикла while(kce==0 && RefreshRates()==false), я сказать не могу. Разным по существу переменным нужно давать разные имена.

Еще, хотя на данной стадии это не критично. Цикл while(kce==0 && RefreshRates()==false) выполняется непрерывно, с полной загрузкой процессора, до прихода тика с нужным курсом. Лучше вставить ожидание Sleep(16) или больше 16 миллисекунд, ведь тики приходят обычно раз в 2-3 секунды, крайне редко 10 раз в секунду, то есть с шагом 100 миллисекунд. Отдайте процессорное время другим, Вам нужна очень-очень малая его часть, порядка миллионной доли или меньше.

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