Трал двойной, есть 2 проблемки,как решить?

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

Добрый день!


У меня действуют одновременно 2 траловых функции:

1 проблема- перенос стоп-лосса каждую минуту проводится не по закрытым минутных свечам на 1 пипс,а через минуту и по времени не совпадающему с iClose

минутных свеч, в чем приична? Код блока:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Сопровождение позиций синхронным тралом                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void SynchroTrailing(string sy="", int op=-1, int mn=-1) {  //1
  double po, pp;
  int    i, k=OrdersTotal();
  double prev=iClose(sy,PERIOD_M1,2);
  double last=iClose(sy,PERIOD_M1,1); 
  if (sy==NULL) sy=Symbol();
  for (i=0; i<k; i++) {      //2
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {    //3
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {   //4
        po=MarketInfo(OrderSymbol(), MODE_POINT);
        if (mn<0 || OrderMagicNumber()==mn)
         {  //5
          if (OrderType()==OP_BUY)
           {  //6
            pp=MarketInfo(OrderSymbol(), MODE_BID);
             if ((last>prev) || (last>prev))
              {   //7
            ModifyOrder(-1,OrderStopLoss()+(1*po),-1);
              }    //7
           }    //6
         }  //5-1
 //------------------------------------------------------------------------------
          if (OrderType()==OP_SELL)
        {  //8
            pp=MarketInfo(OrderSymbol(), MODE_ASK);
          if ((last<prev) || (last>prev))
           {   //9
        ModifyOrder(-1,OrderStopLoss()-(1*po),-1);
           }    //9
        }  //8
     //}//5-2
      }
    }
  }
  Sleep(60*1000); //60 sekund
}
//+---------------------------------------------------------------------------------------------------------------------+

Второй блок трала : проблема в том, что заданы 3 ступени переноса в безубыток при достижении этих показателей:

//----------------------------------------------------------------------------------------------------
extern int     Stoploss             = 0,          //стоплосс
               Takeprofit           = 3000,          //тейкпрофит
               NoLoss1              = 200,            //перевод в безубыток, если 0, то нет перевода в безубыток
               MinProfitNoLoss1      = 55,             //минимальная прибыль при переводе в безубыток
               NoLoss2              = 400,            //перевод в безубыток, если 0, то нет перевода в безубыток
               MinProfitNoLoss2      = 95,             //минимальная прибыль при переводе в безубыток
               NoLoss3               = 600,            //перевод в безубыток, если 0, то нет перевода в безубыток
               MinProfitNoLoss3      = 155;             //минимальная прибыль при переводе в безубыток

но перенос не происходит почему-то, вот  второй трал:

//+---------------------------------------------------------------------------------------------------------------------+
void Modif_orders(string vSymbol) //, minstoplevel)
{
  // if (!IsTradeAllowed()) return(0);
  // int STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
  //--- вычисленные значения цен SL и TP должны быть нормализованы
 //  double stoploss=NormalizeDouble(Bid-minstoplevel*Point,Digits);
 //  double takeprofit=NormalizeDouble(Bid+minstoplevel*Point,Digits);
  // minstoplevel=MarketInfo(vSymbol,MODE_STOPLEVEL);
 //  minstoplevel=11 ; //MarketInfo(vSymbol,MODE_STOPLEVEL);
   double poit=MarketInfo(vSymbol,MODE_POINT);
   double mybid   = MarketInfo(vSymbol,MODE_BID);
   double myask   = MarketInfo(vSymbol,MODE_ASK);
   double OSL,OTP,OOP,SL,TP,StLo1,StLo2,StLo3;
   int tip;
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol()==vSymbol)
         {
            tip = OrderType();
            OSL = NormalizeDouble(OrderStopLoss(),Digits);
            OTP = NormalizeDouble(OrderTakeProfit(),Digits);
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
         //   SL=OSL;TP=OTP;
   //=======================================================================================================
            if (tip==OP_BUY)            
            {  
          //  RefreshRates();
            //  if (OSL<OOP && NoLoss>=minstoplevel && (((mybid-OOP)/poit)>(minstoplevel+91*poit)))
               if (((mybid-OOP)/poit)>NoLoss3)  //|| (((mybid-OOP)/poit)>NoLoss2) || (((mybid-OOP)/poit)>NoLoss1))//   (minstoplevel+91*poit)))
               {
                  StLo3 = NormalizeDouble(OOP+MinProfitNoLoss3*poit,Digits);
                   }
             }   // 1 цикл
                //    else
      //----------------------------------------------------------------------------------------------------------------
         if (tip==OP_BUY)            
            { 
         if (((mybid-OOP)/poit)>NoLoss2)  //   (minstoplevel+91*poit)))
             
               {
                  StLo2 = NormalizeDouble(OOP+MinProfitNoLoss2*poit,Digits);
               //   if (StLo2 > OSL && StLo2 <= NormalizeDouble(mybid - NoLoss2 * poit,Digits)) SL = StLo2;
               }
             }  // 2 цикл
          //     else
       //---------------------------------------------------------------------------------------------------------------
        if (tip==OP_BUY)            
            { 
        if (((mybid-OOP)/poit)>NoLoss1)  //   (minstoplevel+91*poit)))
             
               {
                  StLo1 = NormalizeDouble(OOP+MinProfitNoLoss1*poit,Digits);
                //  if (StLo1 > OSL && StLo1 <= NormalizeDouble(mybid - NoLoss1 * poit,Digits))  SL = StLo1;
               }
            } //  3 цикл
   //=================================================================================================================                                       
            if (tip==OP_SELL)        
            {
        //    RefreshRates();
           //  if ((OSL>OOP || OSL==0) && NoLoss>=minstoplevel && (((OOP-myask)/poit)>(minstoplevel+91*poit)))
               if (((OOP-myask)/poit)>NoLoss3 )  //(minstoplevel+91*poit)))
               {
                  StLo3 = NormalizeDouble(OOP-MinProfitNoLoss3*poit,Digits);
                //  if ((StLo3 < OSL || OSL==0) && StLo3 >= NormalizeDouble(myask + NoLoss3 * poit,Digits)) SL = StLo3;
               }
            //   if (SL != OSL || TP != OTP)
            //   {  
            //      if (!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
            //   }
               else
  //-------------------------------------------------------------------------------------------------------------------------
     if (((OOP-myask)/poit)>NoLoss2 )  //(minstoplevel+91*poit)))
            
               {
                  StLo2 = NormalizeDouble(OOP-MinProfitNoLoss2*poit,Digits);
               //   if ((StLo2 < OSL || OSL==0) && StLo2 >= NormalizeDouble(myask + NoLoss2 * poit,Digits)) SL = StLo2;
               }
               else
  //-------------------------------------------------------------------------------------------------------------------------
     if (((OOP-myask)/poit)>NoLoss1 )  //(minstoplevel+91*poit)))
            
               {
                  StLo1 = NormalizeDouble(OOP-MinProfitNoLoss1*poit,Digits);
             //   if ((StLo1 < OSL || OSL==0) && StLo1 >= NormalizeDouble(myask + NoLoss1 * poit,Digits)) SL = StLo1;
               }
  //-----------------------------------------------------------------------------------------------------------------------
            }
         }
      }
   }
       //return(0);
}
//+----------------------------------------------------------------------------+

В общем по 2 тралам нужно,чтобы стоп двигался по 1 пипсу при закрытии каждую минуту,и

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

Кто-то может подсказать как исправить мои ошибки?

Dmitry Fedoseev
57696
Dmitry Fedoseev  

1. Время закрытия неизвестно и не может быть известным. Действия выполняются на открытии бара, а открытие не обязано происходить точно в указанное время бара.

2. Используйте средства отладки и смотрите, что не так и почему оно не так.

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