Кто может с сеточником помочь?

 

Проблема в том, что когда в коде меняешь лот, профит, изменений не происходит, как было изначально, так и осталось. 
Прибыль в безубыток не переносится. В общем, нужна помощь. А так в тестере вроде не плохие результаты показывает, но сыроват. 
Сам боюсь не разберусь. Пишите в ЛС если готовы помочь. Сеточник с просторов инета... 

Файлы:
Setka.mq4  11 kb
 
Anton Nikiforov:
Проблема в том, что когда в коде меняешь лот, профит, изменений не происходит, как было изначально, так и осталось. 
Прибыль в безубыток не переносится. В общем, нужна помощь. А так в тестере вроде не плохие результаты показывает, но сыроват. 
Сам боюсь не разберусь. Пишите в ЛС если готовы помочь. 
А почему не хотите выложить открытый код прямо здесь? Так больше вероятности, что подскажут или укажут на ошибки.
 
Karputov Vladimir:
А почему не хотите выложить открытый код прямо здесь? Так больше вероятности, что подскажут или укажут на ошибки.
все сделал. Спасибо за совет.
 
//+------------------------------------------------------------------+
//|                                               grid_6_symbols.mq4 |
//|                               Copyright © 2015, Vladimir Hlystov |
//|                                                cmillion@narod.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, Vladimir Hlystov"
#property link      "cmillion@narod.ru"
#property strict
#property description "Советник выставляет сети из стоп ордеров по указанным парам"
#property description "Как только суммарный профит по всем позициям превысит указанный уровень,"
#property description "советник закрывает все и по новой переоткрывает сети"
//---
extern      string Symbol1 = "XAUUSD";
//---
extern      int    sleep  = 300; // Задержка после закрытия в секундах
extern      int    Step   = 500; // Шаг между ордерами
//--- При достижении прибыли NoLoss + MinProfitNL (измеряется в пунктах) стоп-лосс переносим на цену открытия ордера плюс минус MinProfitNL
extern      int    NoLoss=300; // Безубыток (расстояние от СЛ до цены)
extern      int    MinProfitNL=100; // Минимальная прибыль безубытка
//---
extern      int    Orders=20;  // Кол-во отложенных
extern      double Lot    = 0.5;
extern      double Profit = 100;
extern      int    Magic  = 123;
//-------------------------------
string val,symbol[6];
int n=0,digits[6];
double point[6];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   val=" "+AccountCurrency();
   n=0;
   if(MarketInfo(Symbol1,MODE_TRADEALLOWED)==1&&Symbol1 != "") {symbol[n] = Symbol1; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;}
  
//---
   if(n==0 && IsTesting()) {symbol[0]=Symbol(); point[n]=MarketInfo(symbol[n],MODE_POINT); digits[n]=(int)MarketInfo(symbol[n],MODE_DIGITS);n=1;} // тестер 
//---
   Comment("Торговля по ",n," сим");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int S(string sym)
  {
   for(int i=0; i<6; i++)
      if(symbol[i] == sym) return(i);
   return(-1);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(!IsTesting()) ObjectsDeleteAll();
   Comment("");
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   if(n==0 || n>6) {Comment("Торги по выбранным парам запрещены"); return;}
   int OT,i,j,orders=0;
   double OSL,OOP,profit=0;
   double ProfitS[6];
   ArrayInitialize(ProfitS,0);
   double MaxPrice[6],MinPrice[6];
   ArrayInitialize(MaxPrice,0);
   ArrayInitialize(MinPrice,0);
   int bs[6],ss[6];
   ArrayInitialize(bs,0);
   ArrayInitialize(ss,0);
   for(i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderMagicNumber()==Magic)
           {
            j=S(OrderSymbol());
            if(j!=-1)
              {
               OT=OrderType();
               ProfitS[j]+=OrderProfit()+OrderSwap()+OrderCommission();
               profit+=OrderProfit()+OrderSwap()+OrderCommission();
               orders++;
               OOP = NormalizeDouble(OrderOpenPrice(),digits[j]);
               OSL = NormalizeDouble(OrderStopLoss(),digits[j]);
               if(OT==OP_BUY)
                 {
                  if(MaxPrice[j]<OOP) MaxPrice[j]=OOP;
                  if(MarketInfo(symbol[j],MODE_BID)>=NormalizeDouble(OOP+(MinProfitNL+NoLoss)*point[j],digits[j]) && OSL<NormalizeDouble(OOP+MinProfitNL*point[j],digits[j]))
                    {
                     if(!OrderModify(OrderTicket(),OOP,NormalizeDouble(OOP+MinProfitNL*point[j],digits[j]),OrderTakeProfit(),0,White))
                        Print(symbol[j]," NoLoss Error ",GetLastError(),"  order ",OrderTicket(),"   SL ",DoubleToStr(OOP+MinProfitNL*point[j],digits[j]));
                    }
                 }
               if(OT==OP_SELL)
                 {
                  if(MinPrice[j]>OOP ||  MinPrice[j]==0) MinPrice[j]=OOP;
                  if(MarketInfo(symbol[j],MODE_ASK)<=NormalizeDouble(OOP -(MinProfitNL+NoLoss)*point[j],digits[j]) &&(OSL==0|| OSL>NormalizeDouble(OOP-MinProfitNL*point[j],digits[j])))
                    {
                     if(!OrderModify(OrderTicket(),OOP,NormalizeDouble(OOP-MinProfitNL*point[j],digits[j]),OrderTakeProfit(),0,White))
                        Print(symbol[j]," NoLoss Error ",GetLastError(),"  order ",OrderTicket(),"   SL ",DoubleToStr(OOP+MinProfitNL*point[j],digits[j]));
                    }
                 }
               if(OT==OP_BUYSTOP)
                 {
                  if(MaxPrice[j]<OOP) MaxPrice[j]=OOP;
                  bs[j]++;
                 }
               if(OT==OP_SELLSTOP)
                 {
                  if(MinPrice[j]>OOP || MinPrice[j]==0) MinPrice[j]=OOP;
                  ss[j]++;
                 }
              }
           }
        }
     }
   if(sleep>0 && orders==0)
     {
      for(i=OrdersHistoryTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
           {
            if(OrderMagicNumber()==Magic)
              {
               if(S(OrderSymbol())!=-1) if(TimeCurrent()-OrderCloseTime()<sleep) return;
               break;
              }
           }
        }
     }
   double price;
   for(i=0; i<n; i++)
     {
      if(bs[i]<Orders)
        {
         if(MaxPrice[i]==0) price=NormalizeDouble(MarketInfo(symbol[i],MODE_ASK)+Step*point[i],digits[i]);
         else price=NormalizeDouble(MaxPrice[i]+Step*point[i],digits[i]);
         if(price<NormalizeDouble(MarketInfo(symbol[i],MODE_ASK)+MarketInfo(symbol[i],MODE_STOPLEVEL)*point[i],digits[i]))
            price=NormalizeDouble(MarketInfo(symbol[i],MODE_ASK)+MarketInfo(symbol[i],MODE_STOPLEVEL)*point[i],digits[i]);
         if(OrderSend(symbol[i],OP_BUYSTOP,Lot,price,30,0,0,"GRID ",Magic,0,CLR_NONE)==-1)
            Comment("OrderSend ",symbol[i]," Error ",GetLastError());
        }
      //---
      if(ss[i]<Orders)
        {
         if(MinPrice[i]==0) price=NormalizeDouble(MarketInfo(symbol[i],MODE_BID)-Step*point[i],digits[i]);
         else price=NormalizeDouble(MinPrice[i]-Step*point[i],digits[i]);
         if(price>NormalizeDouble(MarketInfo(symbol[i],MODE_BID)-MarketInfo(symbol[i],MODE_STOPLEVEL)*point[i],digits[i]))
            price=NormalizeDouble(MarketInfo(symbol[i],MODE_BID)-MarketInfo(symbol[i],MODE_STOPLEVEL)*point[i],digits[i]);

         if(OrderSend(symbol[i],OP_SELLSTOP,Lot,price,30,0,0,"GRID ",Magic,0,CLR_NONE)==-1)
            Comment("OrderSend ",symbol[i]," Error ",GetLastError());
        }
      RefreshRates();
     }
//---
   if(profit>Profit) DeleteAllOrders();
//---
   DrawLABEL("Balance",StringConcatenate("Balance ",DoubleToStr(AccountBalance(),2),val),5,35,Lime);
   DrawLABEL("Equity",StringConcatenate("Equity ",DoubleToStr(AccountEquity(),2),val),5,55,Lime);
   DrawLABEL("FreeMargin",StringConcatenate("FreeMargin ",DoubleToStr(AccountFreeMargin(),2),val),5,75,Lime);
   for(i=0; i<n; i++)
      DrawLABEL(StringConcatenate("Profit ",symbol[i]),StringConcatenate("Profit ",symbol[i]," ",DoubleToStr(ProfitS[i],2),val),5,100+20*i,Color(ProfitS[i]<0,clrRed,clrLime));
   DrawLABEL("Profit ",StringConcatenate("Profit ",DoubleToStr(profit,2)," (close ",DoubleToStr(Profit,2),")"),5,105+20*n,Color(profit<0,clrRed,clrLime));
   return;
  }
//-------------------------------
color Color(bool P,color a,color b)
  {
   if(P) return(a);
   else return(b);
  }
//------------------------------------------------------------------
void DrawLABEL(string name,string Name,int x,int y,color clr)
  {
   if(ObjectFind(name)==-1)
     {
      ObjectCreate(name,OBJ_LABEL,0,0,0);
      ObjectSet(name,OBJPROP_CORNER,1);
      ObjectSet(name,OBJPROP_XDISTANCE,x);
      ObjectSet(name,OBJPROP_YDISTANCE,y);
     }
   ObjectSetText(name,Name,12,"Arial",clr);
  }
//--------------------------------------------------------------------
void DeleteAllOrders()
  {
   bool error=true;
   int i,j,nn=0;
   while(true)
     {
      if(!IsDemo())
        {
         int ret=MessageBox("Закрыть все ордера","Демо версия",MB_YESNO|MB_TOPMOST);
         if(ret==IDNO) return;
        }
      for(i=OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS))
           {
            if(OrderMagicNumber()==Magic)
              {
               j=S(OrderSymbol());
               if(j!=-1)
                 {
                  int OT=OrderType();
                  int Ticket=OrderTicket();
                  if(OT==OP_BUY)
                    {
                     error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(symbol[j],MODE_BID),digits[j]),50,clrNONE);
                    }
                  if(OT==OP_SELL)
                    {
                     error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(symbol[j],MODE_ASK),digits[j]),50,clrNONE);
                    }
                  if(OT>1)
                     if(!OrderDelete(Ticket))
                        Comment("Ордер ",Ticket," ошибка удаления ",GetLastError());
                  //---
                  if(!error)
                    {
                     int err=GetLastError();
                     if(err<2) continue;
                     if(err==129)
                       {
                        Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_SECONDS));
                        Sleep(500);
                        RefreshRates();
                        continue;
                       }
                     if(err==146)
                       {
                        j++;
                        if(IsTradeContextBusy()) Sleep(500);
                        RefreshRates();
                        continue;
                       }
                    }
                 }
              }
           }
        }
      int k=0;
      for(j= 0; j<OrdersTotal(); j++)
        {
         if(OrderSelect(j,SELECT_BY_POS))
           {
            if(OrderMagicNumber()==Magic)
              {
               if(S(OrderSymbol())!=-1) k++;
              }
           }
        }
      if(k==0) break;
      nn++;
      if(nn>10) break;
      Sleep(500);
      RefreshRates();
     }
  }
//-------------------------------        
вот так лот меняется, в бу вроде переводится. Только он мультивалютный, в тестере не будет работать как надо
 
Maxim Dmitrievsky:
вот так лот меняется, в бу вроде переводится. Только он мультивалютный, в тестере не будет работать как надо

а как его переделать под зоито?)

 
Maxim Dmitrievsky:
Только он мультивалютный, в тестере не будет работать как надо

если это не индикаторый сеточник,то его можно потестировать в мт5 через эту библиотеку https://www.mql5.com/ru/code/16006

MT4Orders
MT4Orders
  • голосов: 14
  • 2016.08.05
  • fxsaber
  • www.mql5.com
Параллельное использование ордерных систем MetaTrader 4 и MetaTrader 5.
 
Anton Nikiforov:

а как его переделать под зоито?)

а не работает разве? так то ничего переделывать не надо, просто поменять входные параметры с учетом его волатильности
 
ivanivan_11:

если это не индикаторый сеточник,то его можно потестировать в мт5 через эту библиотеку https://www.mql5.com/ru/code/16006

не разбирался пока в вашей библиотеке, но вещч, безусловно, полезная )
 
Maxim Dmitrievsky:
а не работает разве? так то ничего переделывать не надо, просто поменять входные параметры с учетом его волатильности

OrderSend XAUUSD error 136, это на сколько я помню *нет цены*.

 
Сеточник обычно сливает, за ним следить надо постоянно.  Аккуратнее.
 
Sergey Mitrofanov:
Сеточник обычно сливает, за ним следить надо постоянно.  Аккуратнее.

Спасибо, учту.