Скачать MetaTrader 5

Как разобрать строку (описание) передаваемую из индикатора?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Слава
42
Слава  

У меня советник выставляет ордера по линиям выставленным ранее, данные для выставления ордера берутся из описания этой горизонтальной линии. Пример моего кода. Такой разбор не очень удачен, так как надо вручную выставлять с какого места начинать и заканчивать разбор строги, что достаточно примитивно. Какие есть идеи. Буду очень признателен за помощь.

int obj_total=ObjectsTotal();
      for(int i=0;i<obj_total;i++)
      {
         string LineName=ObjectName(i);
         if(ObjectType(LineName)!=OBJ_HLINE)continue;// если объект на графике не линия с данными об отложеннике, то идем дальше
         string LineText=ObjectDescription(LineName);
   
         string strOrderType=StringSubstr(LineText,0,1);
         int iOrderType=StrToInteger(strOrderType);
   
         string strOrderLots=StringSubstr(LineText,1,4);
         double dOrderLots=StrToDouble(strOrderLots);
         double nOrderLots=NormalizeDouble(dOrderLots,2);

         string strOrderOpenPrice=StringSubstr(LineText,5,7);
         double dOrderOpenPrice=StrToDouble(strOrderOpenPrice);
         double nOrderOpenPrice=NormalizeDouble(dOrderOpenPrice,Digits);
            
         string strOrderStopLoss=StringSubstr(LineText,12,7);
         double dOrderStopLoss=StrToDouble(strOrderStopLoss);
         double nOrderStopLoss=NormalizeDouble(dOrderStopLoss,Digits);
         
         string strOrderTakeProfit=StringSubstr(LineText,19,7);
         double dOrderTakeProfit=StrToDouble(strOrderTakeProfit);
         double nOrderTakeProfit=NormalizeDouble(dOrderTakeProfit,Digits);
         
         string strOrderMagicNumber=StringSubstr(LineText,26);
         int iOrderMagicNumber=StrToInteger(strOrderMagicNumber);
     
         double margin=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
         
         RefreshRates();
         if(Ask<nOrderOpenPrice-margin || Bid>nOrderOpenPrice+margin)
         {
            if(ObjectDelete(LineName)==true)
            {
               RefreshRates();
               int ticketdel=OrderSend(Symbol(),iOrderType,nOrderLots,nOrderOpenPrice,30,nOrderStopLoss,nOrderTakeProfit,"Delete order",iOrderMagicNumber,0,CLR_NONE);      
               Print("Ордер с тикетом - ",ticketdel," был установлен из удаленных");   
            }
         }
         else//if(iOrderType==OP_BUYSTOP&&Ask>=nOrderOpenPrice-margin*Point || iOrderType==OP_SELLSTOP&&Bid<nOrderOpenPrice+margin*Point)
         {   
            if(ObjectDelete(LineName)==true)
            {
               Print("Данные по ордеру были удаленны, так как цена не соответствует требованиям");
               continue;
            }
         }
      } 
Слава
42
Слава  
Есть идеи?
Alexandr Bryzgalov
29640
Alexandr Bryzgalov  

Удаленный ордер записывается в историю ордеров, в линию забей только тикет, и при обратной установке читай тикет и ищи в истории по тикету, найдя ордер копируй нужные параметры для вновь устанавливаемого ордера.

ЗЫ: по выполнению это будет дольше(не на много), но зато проще чем с чтением строки из нескольких составляющих

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий