LeonidPetr

 
Уровень 2

  Торгую в компаниях:


Группа "Напишу исправлю советник индикатор MQL4"

Рейтинг 27



Доработка советника

Добрый день.
Может подскажет кто-нибудь? На тестере все работает как часы, как подключаю его на несколько валютных пар, начинается выставление кучи ордеров, не открываются какие нужно и не закрываются как нужно отложенные ордера. Пробовал исправить путем добавления кодов по выбору ордеров, но все больше заходил в тупик. Наверняка есть какой-то простой код, чтобы все происходило как на тестере.

Стратегия очень простая.
Через каждые полчаса открывается рыночный ордер (например BUY) lot=0.1 с ТП 5 пунктов и стопом 100 пунктов по значениям из стохастика, через 80 пунктов от цены открытия рыночного — отложенный ордер (SELLSTOP) Lot1=lot*6 в сторону StopLoss рыночного (алгоритм расчета есть) со стопом 70 пунктов и ТП равным 25 пунктов. В случае открытия отложенного (SELLSTOP) ордера выставляется отложенный(BUYSTOP) на 50пунков от цены открытия (SELLSTOP) с объемом Lot2=Lot1+3 в сторону StopLoss SELLSTOP.
При выполнения тэйк-профита — закрытие всех отложенных.
Стратегия простая, но я только на тестере любой пары добился решения. При совместной работе с другими парами возникает хаос.

extern int StochK=200;                  
extern int StochD=12;                   
extern int StochSlowing=1;            
extern int UpperThreshold=80;         
extern int LowerThreShold=20;
extern int Mn=140;      //Magic
extern int mn;
extern int X=1;
extern int TimFr1=48, TimFr2=24,TimFr3=4;
extern int n=6;
extern double Lot1;
extern double lots;
extern double Lot;

int Ontime()
  {
   int time=0;
   if((Hour()==2&&Minute()<=1)||(Hour()==2&&Minute()==30)||(Hour()==3&&Minute()<=1))

      time=1;

   return(time);
  }


void PutOrderStop(int order_type,double price,double SL,double TP,int Magic)
  {
   int sellstop=0;

   sellstop=OrderSend(Symbol(),order_type,Lot,price,0,SL,TP,"My order#",Mn,0,Red);
   return;
  }


int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Mn)
           {
            if(OrderType()<4)
               count++;
           }
        }
     }
   return(count);
  }
//=========================================================
int BuyTicket;
int SellTicket;


int start()
  {
   double S=AccountMargin() +  AccountFreeMargin();

   int OPB1,OPS1,ss;

   int T=7*X;
   double AA = iClose(NULL,PERIOD_H1,TimFr1),BB = iClose(NULL,PERIOD_H1,TimFr2),
          CC=iClose(NULL,PERIOD_H1,1),AK = iOpen(NULL,PERIOD_H1,4);

   if(S<10000000)
      lots= S*0.0002;

   double AC=(CC-AA)/Point,AKC=(CC-AK)/Point,BC=(CC-BB)/Point;
   double TR = AC;
  double Signal=iStochastic(Symbol(),0,StochK,StochD,StochSlowing,MODE_SMA,STO_LOWHIGH,MODE_SIGNAL,1);
   double Main=iStochastic(Symbol(),0,StochK,StochD,StochSlowing,MODE_SMA,STO_LOWHIGH,MODE_MAIN,1);
   double Last=iStochastic(Symbol(),0,StochK,StochD,StochSlowing,MODE_SMA,STO_LOWHIGH,MODE_BASE,2);
  int s,SS;
   if(Signal>Main)
     {
      double m=Signal/(Main+0.0001);
     }
   else
      if(Signal<Main)
         m=Main/(Signal+0.0001);
   double ma=m*100;
   int DSM=Signal-Main;
   int DMS=Main-Signal;

  
      if(Signal>Main&&Signal<70)
        {
         if((DSM>10&&DSM<30)&&((ma>100&&ma<115)||(ma>120&&ma<700)))
           {OPB1=1; ss=m*Signal; if(ss<90)ss=m*70;if(ss>100)ss=100; SS=ss;}
            else
               if(((ma>105&&ma<105)||(ma>125&&ma<140)||(ma>145&&ma<700)))
                 {OPS1=1; ss=m*Main; if(ss<90)ss=m*90;if(ss>120)ss=110; SS=150;} 
        }

      

   
  s=ss/(n-1);//отработка
   s=s*X;
   ss=ss*X;
   SS=SS*X;

  double Bstoploss,Sstoploss;
   Bstoploss=Bid-ss*Point;
   Sstoploss=Ask+ss*Point;
   int PriceBuy=ss-s-10;
   int PriceSell=ss-s-10;
   double BstopOpen =Ask+ PriceBuy*Point;
   double SstopOpen =Bid- PriceSell*Point;
   double BuyStopLoss=Bid-ss*Point,SellStopLoss=Ask+ss*Point;
   double BstopOpenLoss = BstopOpen-SS*Point;
   double SstopOpenLoss = SstopOpen+SS*Point;
   double BstopClose = BstopOpen+s*Point;
   double SstopClose = SstopOpen-s*Point;
   Lot=lots*n;
   Lot1=lots*(n+n/2);
double OPBSS=OrderOpenPrice()-30*X*Point;  double OPSSS=OrderOpenPrice()+30*X*Point;

   bool operation=0;
     for(int pos=0;pos<OrdersTotal();pos++)
     {if ( OrderSelect (pos, SELECT_BY_POS) == false )  continue;
      if ( OrderSymbol()==Symbol()) break;}

if(Ontime()==1){
    if(OPB1==1)
        {operation=1;if(operation==1 && (OrderSymbol()!=Symbol()||OrdersTotal()==0))
                int OP=OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-ss*Point,Ask+T*Point,"My order#",mn,0,Green);
          }
  if( OP>0 )
         {if((OrderSymbol()!=Symbol()||OrdersTotal()==1))
         PutOrderStop(5,SstopOpen,SstopOpenLoss,SstopClose,Mn);}
    
    if(OPS1==1)      
        {operation=1;if(operation==1 &&(OrderSymbol()!=Symbol()||OrdersTotal()==0))
        int OPSs=OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+ss*Point,Bid-T*Point,"My order#",mn,0,Red);
        }
     if( OPSs>0 )
         {if((OrderSymbol()!=Symbol()||OrdersTotal()==1))
         PutOrderStop(4,BstopOpen,BstopOpenLoss,BstopClose,Mn);
          }    
        }
     

      

 if(CountTrades()==1){  
 if((OrderSymbol()!=Symbol()||OrdersTotal()==2))
 {  
  BuyTicket = OrderSend(Symbol(),OP_BUYSTOP,Lot1,OPBSS,0,OPBSS-70*X*Point,OPBSS+45*X*Point,"My order#",Mn,0,Blue);}
return(0);
 }

if(CountTrades()==1){ 
if((OrderSymbol()!=Symbol()||OrdersTotal()==2)){
SellTicket=OrderSend(Symbol(),OP_SELLSTOP,Lot1,OPSSS,0,OPSSS+70*X*Point,OPSSS-30*X*Point,"My order#",Mn,0,Red);}
return(0);
}     
   
  if(OrderMagicNumber()==Mn)
     {
      for(int j=OrdersTotal()-1; j>=0; j--)
         if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderType()==OP_BUYSTOP && OrderSymbol()==Symbol()&&OrderMagicNumber())
               int del=OrderDelete(OrderTicket());

            if(OrderType()==OP_SELLSTOP && OrderSymbol()==Symbol()&&OrderMagicNumber())
               del=OrderDelete(OrderTicket());
           }
      return(0);
     }

   Comment("\n |  SIMsim ", "  Валюта   ",Symbol(),
           "\n |      Значения TR          ",TR,
           "\n |      Значения OrdersTotal()         ",OrdersTotal(),
           "\n |      Значения OPr        ",0,
           "\n |      Значения ma === ",ma,"           Значения total_orders         ",TotalOpenOrders(),
           "\n |      Значения OPB1       ",OPB1,"     Значения OPS1      ",OPS1,
           "\n |      Значения Main       ",Main,"     Значения DSM       ",DSM,"     Значения DMS       ",DMS,
           "\n |      Значения Signal     ",Signal,"     Значения OPBSS      ",OPBSS,"     Значения OPBSS      ",OPSSS,
           "\n |      Значения lots       ",lots,"     Значения OrderOpenPrice()         ",OrderOpenPrice(),
           "\n |      Значения ss         ",ss,"     Значения count      ",CountTrades(),
           "\n |      Mn              ",Mn
          );



   return(0);

  }
  • +2
  • Просмотров: 1110
  • 26 июня 2021, 09:25
  • LeonidPetr
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Напишу исправлю советник индикатор MQL4", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
Следующая запись в группе  
Вопрос
07 июня 2021
19 июля 2021

Брокер для ваших роботов, 15 лет на рынке

Комментарии (1)

+
0
Код:
if(OrderMagicNumber()==Mn)
     {
      for(int j=OrdersTotal()-1; j>=0; j--)
         if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderType()==OP_BUYSTOP && OrderSymbol()==Symbol()&&OrderMagicNumber())
               int del=OrderDelete(OrderTicket());

            if(OrderType()==OP_SELLSTOP && OrderSymbol()==Symbol()&&OrderMagicNumber())
               del=OrderDelete(OrderTicket());
           }
      return(0);
     }


Оберни в функцию Таймер

if(ti!=iTime(NULL,TF1,0)&&(Ask-Bid)<Spred*Point)
           { ti=iTime(NULL,TF1,0);}
avatar

  13  axe44 Сообщений: 1149 - Алек

  • 26 июня 2021, 09:56

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