MQL4 мой первый советник обменивает, если я увеличиваю количество условий, которые он рассчитывает - PullRequest
0 голосов
/ 26 сентября 2018

Я создал советник, который вычисляет некоторые условия и дает значение long или short для каждого условия (+ или - 0,1 лота), а затем суммирует все условия, чтобы получить чистую длинную или короткую позицию.

Затем он должен либо открыть новый ордер, либо закрыть открытый, чтобы изменить предыдущие открытые позиции (mlot), чтобы соответствовать целевому значению, которое торговые условия рассчитали (сумму) при изменении каждого нового бара;это делается с помощью функции ontick.

Если я использую только одно или два условия, это прекрасно работает, но когда я увеличиваю количество условий (сумма может быть больше 0,2 лота или меньше -0,2 лота)он торгуется на одну единицу, а затем закрывает позицию, которую он должен, а затем снова торгует на одну, что не должно попасть в неприятный цикл.

Я не понимаю, почему это идеально сработало бы для двоихусловия, но не более чем на два. Интересно, если у кого-то есть идея, я был бы признателен за любой вклад.

Это моя первая попытка советника, любые мысли будут высоко оценены с наилучшими пожеланиями Кен

//+------------------------------------------------------------------+
//|                                                        test.mq4  |
//|                                     Copyright 2018, K T          |
//|                                          https://                |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, K T"
#property link      ""
#property version   "1.00"
#property strict
#property description "SIMPLE TRADER"

//INPUT PARAMETERS
input double   lots=0.1;
input int      MagicNumber=1111;//MAGICNO MUST BE UNIQUE
input int      condno=1; //1=3/10 10 2=10 10/20 3=ALL
input double   test=0.0;      
input int      spread=1;
input int      slippage=10;
input string   simble="FTSE100(£)"; 
input int      period=PERIOD_M1; 
input double   TP=200;
input double   SL=100;
input int      ma1input=3;
input int      ma2input=10;
input int      ma3input=20;
input int      sleep=0;


//ONINIT TEST FOR CORRECR CONDITIONS
int OnInit()
  {
  string simble1=simble;
  int period1=period;
  if (simble1==Symbol()&& period1==Period() && Ask-Bid<=spread)
  {
  Alert ("CORRECT SYMBOL ", simble," mlots=", mlots(),"sum= ",sum());
  Alert ("CORRECT TIME T", period);
  return(INIT_SUCCEEDED);
  }
  else
  {
  Alert ("INIT FAILED");
  Alert ("wrong symbol, time or spread too wide");

  return(INIT_FAILED);
  }
  }

//ON EVERY TICK
void OnTick()
   {
   double sum1 = sum();
   double mlots1 = mlots();

   if(sum1 == mlots1)
   {
   neutral();
   return;
   }
   else if(sum1>mlots1 && mlots1>=0 && mlots1!= sum1)
   {
   openbuy();
   return;
   }

   else if(sum1>mlots1 && mlots1<0 && mlots1!= sum1)
   {
   closesell();
   return;
   }

   else if(sum1<mlots1 && mlots1<=0 && mlots1!= sum1)
   {
   opensell();
   return;
   }

   else if(sum1<mlots1 && mlots1>0 && mlots1!= sum1)
   {
   closebuy();
   return;
   }

   else 

   return;   
   }

//NEUTRAL
void  neutral()
   {
   Alert("T", period, " EQUILIBRIUM ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
   return;
   }

//OPEN BUY
void openbuy()
  {

   double TakeProfitLevel;
   double StopLossLevel;
   TakeProfitLevel = Bid + TP*Point*10;   //0.00001 * 10 = 0.0001
   StopLossLevel = Bid - SL*Point*10;

   if(mlots()!= sum())
   {
   OrderSend(simble, OP_BUY, lots, Ask, slippage*10, StopLossLevel, TakeProfitLevel, "BUY", MagicNumber);//notice that slippage also has to be multiplied by 10
   Alert(MagicNumber," T", period, " OPENBUYFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
   Sleep(sleep);
   return;
   }
   else
   {
   return;
   }
  }


//OPEN SELL
void opensell()
  {
  double TakeProfitLevel;
  double StopLossLevel;

   //here we are assuming that the TakeProfit and StopLoss are entered in Pips
   TakeProfitLevel = Ask - TP*Point*10;   //0.00001 * 10 = 0.0001
   StopLossLevel = Ask + SL*Point*10;

   if (mlots()!= sum())
   {
   OrderSend(simble, OP_SELL, lots, Bid, slippage*10, StopLossLevel, TakeProfitLevel, "SELL", MagicNumber);   //notice that slippage also has to be multiplied by 10
   Alert(MagicNumber," T", period, " OPENSELLFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
   Sleep(sleep);
   return;
   }
   else
   {
   return;
   }
   }


//CLOSE BUY
void closebuy()
  {
  if(mlots()==sum())
  {
  neutral();
  return;
  }
  int low=OrderTicket();
  int i=OrdersTotal();
  for (i = OrdersTotal(); i >=0; i--) 
  {
  if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
  if (i<=OrdersTotal() && OrderType()== OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber )
  bool closed = OrderClose( low, OrderLots(), Bid, slippage, White);
  Alert("Ticket= ", low);
  Alert(MagicNumber," T", period, " CLOSEBUYFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
  Sleep(sleep);
  return;
  }  

  }

//CLOSE SELL
void closesell()
  {
  if(mlots()==sum())neutral();
  int low=OrderTicket();
  int i=OrdersTotal();
  for (i = OrdersTotal(); i >=0; i--) 
  {
  if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
  if (i<=OrdersTotal() && OrderType()== OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber )
  bool closed = OrderClose( low, OrderLots(), Ask, slippage, White);
  Alert("Ticket= ", low);
  Alert(MagicNumber," T", period, " CLOSESELLFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
  Sleep(sleep);
  return;
  }  

  }


//CONDITION 1
double cond1()   //cond 1 3ema 10ma
   {
   double   ma1;
   double   ma2;
   ma1=iMA(NULL,0,ma1input,0,MODE_EMA,PRICE_CLOSE,1);//3EMA
   ma2=iMA(NULL,0,ma2input,0,MODE_SMA,PRICE_CLOSE,1);//10MA
   if(ma1>=ma2)
      {
      return(lots);
      }
   else
      {
      return(lots*-1);
      }
      }

//CONDITION 2
double cond2()   //cond 2 10ema 10ma
   {
   double   ma1;
   double   ma2;
   ma1=iMA(NULL,0,ma1input,0,MODE_EMA,PRICE_CLOSE,1);//3EMA
   ma2=iMA(NULL,0,ma2input,0,MODE_EMA,PRICE_CLOSE,1);//10EMA
   if(ma1>=ma2)
      {
      return(lots);
      }
   else       
      {
      return(lots*-1);
      }
      }

//CONDITION 3
double cond3()   //cond 3 10ema 20ema
   {
   double   ma1;
   double   ma2;
   ma1=iMA(NULL,0,ma2input,0,MODE_EMA,PRICE_CLOSE,1);//10EMA
   ma2=iMA(NULL,0,ma3input,0,MODE_EMA,PRICE_CLOSE,1);//20EMA
   if(ma1>=ma2)
      {
      return(lots);
      }
   else
      {
      return(lots*-1);
      }
      }


//CONDITION 4
double cond4()   //cond 4 10ma 20Ema
   {
   double   ma1;
   double   ma2;
   ma1=iMA(NULL,0,ma2input,0,MODE_SMA,PRICE_CLOSE,1);//10MA
   ma2=iMA(NULL,0,ma3input,0,MODE_EMA,PRICE_CLOSE,1);//20EMA
   if(ma1>=ma2)
      {
      return(lots);
      }
   else       
      {
      return(lots*-1);
      }
      }
//SELECTING CONDITIONS TO BE INCLUDED
double   sum()
      {
      if(condno==1)
      {
      return(cond1() + cond2());
      }
      else if(condno==2)
      {
      return(cond3() + cond4());
      }
      else if (condno==3)
      {
      return(cond1() + cond2()+ cond3() + cond4() );//IF MORE THAN TWO CONDITIONS USED IT OVERTRADES B ONE AND THEN CLOSES ERROR TRADE
      }
      else
      return(cond1() + cond2());
      }

//COUNT OF ALL OPEN TRADES  
double mlots()
   {
   double mlots1 = BuyTotalMagicOpen() + SellTotalMagicOpen();
   double mlots2 = mlots1/10;
   return (mlots2);
   }

//COUNT BUY ORDERS   
double BuyTotalMagicOpen() 
   {
   int OrderCount = 0;
   for (int i = OrdersTotal() - 1; i >= 0; i--) 
   {
   OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
   if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
   if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
   if (OrderType() == OP_BUY) OrderCount++;
   }
return (OrderCount);
   }

//COUNT SELL ORDERS
double SellTotalMagicOpen() 
   {
   int OrderCount = 0;
   for (int i = OrdersTotal() - 1; i >= 0; i--) 
   {
   OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
   if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
   if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
   if (OrderType() == OP_SELL) OrderCount++;
   }
return (OrderCount*-1);
   }

//CLOSE ALL MAGICNUMBER REFRESHRATES BUSYSLEEP MODE
void CloseThis() {
for (int i = OrdersTotal(); i >=0; i--) {
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
    while(IsTradeContextBusy()) Sleep(100);
    RefreshRates();
    if (OrderType() == OP_BUY && Symbol() == OrderSymbol() 
     && MagicNumber == OrderMagicNumber()) {
        bool closed = OrderClose( OrderTicket(), OrderLots(), Bid, slippage, Red);
        Alert("T", period, " BUY CLOSED ON DEINIT");
    }
    if (OrderType() == OP_SELL && Symbol() == OrderSymbol()
     && MagicNumber == OrderMagicNumber()) {
        bool closed = OrderClose( OrderTicket(), OrderLots(), Ask, slippage, Green);
        Alert("T", period, " SELL CLOSED ON DEINIT");
    }
}
}

//DEINIT
void OnDeinit(const int reason)//MAGIC NO
  {
 CloseThis();
 Alert("T", period, " DEINIT SUCCEEDED");
  }
//
...