Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поиск на MQL5.community ведется во всех разделах. Попробуй сам!
prupru
115
prupru 2013.12.24 09:44 

Здравствуйте!

Помогите пожалуйста разобраться, написал советника 2 EMA cross (ну как написал, надергал в основном кусками из примеров), на домашнем компе работает нормально, закинул на windows 2003 VPS от myforexvps, время от времени выдает ошибку terminated by timeout и закрывает сова.

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

вот код:

//+------------------------------------------------------------------+
//|                                                       myEMA1.mq4 |
//|                                                               me |
//|                                                   killnosock.net |
//+------------------------------------------------------------------+
#property copyright "me"
#property link      "killnosock.net"
extern int SlowEma = 21;
extern int FastEma = 10;
extern int MaxRisk = 100;// % of Depo to be traded per order
extern int  TakeProfit=0;
extern int  StopLoss=0;
extern int TrailingStop=0;
extern int Slippage = 1000;
extern double MinDiff = 0.00003;
extern int EmaShift = 0; //lag from intersection, 0 - more false triggers, 1 - more lag

int PrevCross = 0;

//+------------------------------------------------------------------+
//| expert initialization&deinitialization functions                 |
//+------------------------------------------------------------------+
int init(){return(0);}
int deinit() {return(0);}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

double NormPrice(double g_price)
{
   return (NormalizeDouble(g_price,MarketInfo(Symbol(),MODE_DIGITS)));
}

//function GetLot, get size of the lot according to MaxRisk
double GetLot(int Risk)
{double Free    =AccountFreeMargin();
 double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
 double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lot     =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
 if(Lot<Min_Lot) Lot=Min_Lot;
 if(Lot>Max_Lot) Lot=Max_Lot;
 if(Lot*One_Lot>Free) {
 Alert(" free= ", AccountFreeMargin()," for one lot= ", MarketInfo(Symbol(),MODE_MARGINREQUIRED)," lot= ", Lot);
 return(0.0);}
return(Lot);}
//---------------------------- end of GetLot

//function NewOrder, place new order
int NewOrder(int Cmd,double Lot)
{double TP=0; //тейкпрофит
 double SL=0; //стоплосс
 double PR=0; //Цена
 color clr = CLR_NONE;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(Cmd==OP_BUY)
   {PR=Ask;
    if(TakeProfit>0) TP=NormPrice(Ask + Ask*TakeProfit/100);
    if(StopLoss>0) SL=NormPrice(Ask - Ask*StopLoss/100);
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr = Green;}
 if(Cmd==OP_SELL)
   {PR=Bid;
    if(TakeProfit>0) TP=NormPrice(Bid - Bid*TakeProfit/100);
    if(StopLoss>0) SL=NormPrice(Bid + Bid*StopLoss/100);
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr=Red;}
 int tic=OrderSend(Symbol(),Cmd,Lot,PR,Slippage,SL,TP,"",0,0,clr);

 if(tic<0)
  {
   Print("Ошибка открытия ордера: ",GetLastError());
   Print("cmd ", Cmd, " Lot ", Lot, " PR ", PR, " Slip ", Slippage, " SL ", SL, " TP ", TP, " Ask ", Ask, " Bid ", Bid);
   Alert("Ошибка открытия ордера: ",GetLastError());
   Alert("cmd ", Cmd, " Lot ", Lot, " PR ", PR, " Slip ", Slippage, " SL ", SL, " TP ", TP, " Ask ", Ask, " Bid ", Bid);   
  }
return(tic);}
//---------------------------- end of NewOrder



//OpenOrders in case of partial execution
int OpenPartOrders(int Cmd, double Lot)
{
 int NumOrders = 0;
 int LastTic = -1;
 double Step = MarketInfo(Symbol(),MODE_LOTSTEP);
 double LotRemains = Lot;
 
 //MathFloor( /Step)*Step;;
while (LotRemains>0)
 {
  LastTic = NewOrder(Cmd, LotRemains);
  NumOrders++;
  if(OrderSelect(LastTic, SELECT_BY_TICKET)==true)
     {
      LotRemains = LotRemains - OrderLots();
      Print("NumberOfOrders ", NumOrders, " Ticket ", LastTic, " LotRemains ", LotRemains, " initial Lot ", Lot);
      Alert("NumberOfOrders ", NumOrders, " Ticket ", LastTic, " LotRemains ", LotRemains, " initial Lot ", Lot);                
     }
  else
   {
    Print("OrderSelect returned the error of ",GetLastError(), " order ticket ", LastTic);
    Alert("OrderSelect returned the error of ",GetLastError(), " order ticket ", LastTic);
    LotRemains = 0; //not to create an endless loop opening new orders again and again
   }
 } 
return(NumOrders);}
//---------------end of OpenOrders



//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
  {
   Print("Ошибка закрытия ордера: ",GetLastError());
   Print("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
   Alert("Ошибка закрытия ордера: ",GetLastError());
   Alert("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
  }
return;}
//--------------------------- end of close order

//Close all my Orders
void CloseAllOrders()
{

Print("closing all orders, orders total = ", OrdersTotal());
Alert("closing all orders, orders total = ", OrdersTotal());

 while (OrdersTotal()>0)
 {
  for(int i=OrdersTotal()-1;i>=0;i--)
   {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) CloseOrder();
     
    else
     {
      Print("Error selecting order: ",GetLastError());
      Print(" i= ", i, " Symbol= ", OrderSymbol());
      Alert("Error selecting order: ",GetLastError());
      Alert(" i= ", i, " Symbol= ", OrderSymbol());     
     }
   }
 }


return;}
//-----------------------end of close all orders



// check cross
void CheckCross()
{
   double FMA_Current = iMA(Symbol(),0,FastEma,0,MODE_EMA,PRICE_CLOSE,EmaShift);
   double SMA_Current = iMA(Symbol(),0,SlowEma,0,MODE_EMA,PRICE_CLOSE,EmaShift);
   double Poin = (FMA_Current + SMA_Current)/2;
   double Lot;
   if (PrevCross == 0) //Was undefined
   {
      if ((FMA_Current - SMA_Current) >= MinDiff * Poin) PrevCross = 1; //Bullish state
      else if ((SMA_Current - FMA_Current) >= MinDiff * Poin) PrevCross = -1; //Bearish state
      return;
   }
   else if (PrevCross == 1) //Was bullish
   {
      if ((SMA_Current - FMA_Current) >= MinDiff * Poin) //Became bearish
      {
         CloseAllOrders();
         Lot = GetLot(MaxRisk);
         OpenPartOrders(OP_SELL,Lot);
         PrevCross = -1;
      }
   }
   else if (PrevCross == -1) //Was bearish
   {
      if ((FMA_Current - SMA_Current) >= MinDiff * Poin) //Became bullish
      {
         CloseAllOrders();
         Lot = GetLot(MaxRisk);
         OpenPartOrders(OP_BUY,Lot);
         PrevCross = 1;
      }
   }
}
//----------------------------end check cross

// trailing stop
void DoTrailing()
{
   int total = OrdersTotal();
   for (int pos = 0; pos < total; pos++)
   {
      if (OrderSelect(pos, SELECT_BY_POS) == false) continue;

      
         if (OrderType() == OP_BUY)
         {
            RefreshRates();
            if (Bid - OrderOpenPrice() >= TrailingStop * Bid/100) //If profit is greater or equal to the desired Trailing Stop value
            {
               if (OrderStopLoss() < (Bid - TrailingStop * Bid/100)) //If the current stop-loss is below the desired trailing stop level
                  OrderModify(OrderTicket(), OrderOpenPrice(), NormPrice(Bid - TrailingStop * Bid/100), OrderTakeProfit(), 0);
            }
         }
         else if (OrderType() == OP_SELL)
         {
            RefreshRates();
            if (OrderOpenPrice() - Ask >= TrailingStop * Ask/100) //If profit is greater or equal to the desired Trailing Stop value
            {
                      if ((OrderStopLoss() > (Ask + TrailingStop * Ask/100)) || (OrderStopLoss() == 0)) //If the current stop-loss is below the desired trailing stop level
                  OrderModify(OrderTicket(), OrderOpenPrice(), NormPrice(Ask + TrailingStop * Ask/100), OrderTakeProfit(), 0);
            }
         }
      
   }   
}
//--------------------end of trailing stop


//main program
int start()
  {
//----
double Lot;

   if (TrailingStop > 0) DoTrailing();
        
        static datetime Time0;
        if (Time0 == Time[0]) return;
        Time0 = Time[0];
      {
       CheckCross();                 
      }

   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Slawa
Модератор
6677
Slawa 2013.12.24 11:19  

После этого говорят, что метаквотсовский стайлер не нужен...

Навскидку обнаружено 4 бесконечных цикла без какой-либо проверки IsStopped

prupru
115
prupru 2013.12.24 12:21  
stringo:

После этого говорят, что метаквотсовский стайлер не нужен...

Навскидку обнаружено 4 бесконечных цикла без какой-либо проверки IsStopped


что за стайлер?

до выполнения всех этих четырех циклов не доходило, потому что они выполняются только при закрытии/открытии ордеров, что в свою очередь происходит при пересечении EMA, ошибка же вылезала когда EMA были далеки от пересечения

но даже если это из-за циклов, как правильно включить isstopped, вот так?

while( (!IsTradeAllowed()) && (!IsStopped()) ) Sleep(10);
while ( (LotRemains>0) && (!IsStopped()) )
while ( (OrdersTotal()>0) && (!IsStopped()) )
Vitalie Postolache
11045
Vitalie Postolache 2013.12.24 16:46  
А как вам такой вариант что ЕМА пересеклись и обратно разошлись в течении одного бара, на истории этого не видно.
prupru
115
prupru 2013.12.24 17:48  
evillive:
А как вам такой вариант что ЕМА пересеклись и обратно разошлись в течении одного бара, на истории этого не видно.


такое возможно, но не в этот раз, все происходило на часовом интервале и кривые были существенно далеко друг от друга

я думаю, что были превышены процессорные ресурсы VPS, потому что эта ошибка настойчиво вылезает при обновлении виндовс например. перешел на более дорогой тариф, вроде пока нормально

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