0
Спалил себе мозги


Код не работает.
Вдруг зациклился сам на себе.
double up=High[iHighest(NULL,0,MODE_HIGH,Count,0)];//индикация
   double dn=Low[iLowest(NULL,0,MODE_LOW,Count,0)];
   
   double up1=High[iHighest(NULL,0,MODE_HIGH,Count,1)];
   double dn1=Low[iLowest(NULL,0,MODE_LOW,Count,1)];
   
   if(TrailingStop>0) Trailing();

   if((Ask-Bid)<Spred*Point && t!=Time[0])
  
     {

      if(CountOrders(2)<1 && up>up1)
      {
       for(i=CountOrders(2);i<Counts;i++)
        {
        PutOrder(2,(Bid-Delta*_Point-i*Delta*_Point));
        Sleep(100);
        }
      }
     
       
    
     
      if(CountOrders(3)<1 && dn<dn1) 
       {
       for(i=CountOrders(3);i<Counts;i++)
        {
         PutOrder(3,(Ask+Delta*_Point+i*Delta*_Point));
         Sleep(100);
        }
       }
      t=Time[0];    
     }
 //  if(CountTrades()>0) DelOrder();
  }


*think* 
avatar

axe44

  • 6 августа 2018, 20:16
0
То есть в этом проблему не видишь?
Если цена не ушла никуда после волатильности, а вошла в паузу, стопы стоят на прежних уроанях, а сопротивоение и поддержка обновились. Вот как то так. И если цена и до ходит дотех старых значений, то как правило отскакивает. Тут и лось. Проверял визуально
Я пересмотрел свой код и нашёл 2 ошибки. Поможешь?Вместо множителя расстояния нужно это значение поставить как ранее задумывал, то есть во множитель лота.
Потом как то нужно впихнуть проверку по барам, вместо каждого тика. И код будет работать быстрее.
avatar

axe44

  • 6 августа 2018, 08:45
0
Максимальный эффект на графике м5, но оптимизация страшно долго. Аж 1000 часов за 3 года. Как сжать логику хотя бы в 5 раз ?? Окси бы сюда…
avatar

axe44

  • 5 августа 2018, 22:23
0
Красотень...*good* 
avatar

axe44

  • 5 августа 2018, 22:17
+1
Ещё 2 ошибки. Ох, Андрей… Разве нужно покупать если Аск меньше Верхушки и на оборот?
Короче это исправил, потом добавил хрень, потом добавил ещё что-то, потом поставил подсчёт движения в пунктах, удалил удаление (ну всё равно экспирация по времени)…
Потом начал исправлять свои ошибки… Итого собрал третью версию:
//+------------------------------------------------------------------+
//|                                                        Proba.mq4 |
//|                                        Copyright 2018, AM2+axe44 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, AM2+axe44 "
#property link      "http://www.forexsystems.biz"
#property version   "3.00"

//--- Inputs
extern double Lots       = 3;        // лот
extern double KLot       = 1.5;        // увеличение лота
extern int StopLoss      = 50;       // лось
extern int TakeProfit    = 280;      // язь
extern int TrailingStop  = 20;       // трал
extern int StartHour     = 7;        // час начала торговли
extern int Slip          = 3;        // реквот
extern int Count         = 5;        // баров для просчета
extern int Delta         = 10;       // расстояние от экстремума
extern int Expir         = 10;       // время жизни ордеров в минутах
extern int Spred         = 4;       // спред 
extern int Counts        = 5;       // число поз
extern int Magic         = 123;      // магик
datetime t=1;int i;
// https://www.mql5.com/ru/signals/383802
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(Digits==3 || Digits==5)
     {
      TakeProfit*=10;
      StopLoss*=10;
      Delta*=10;
      Slip*=10;
      Spred*=10;
     }
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expir*60,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   for(i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*Point)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if((OrderOpenPrice()-Ask)>TrailingStop*Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*Point)) || (OrderStopLoss()==0))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
/*void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }*/
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double up=High[iHighest(NULL,0,MODE_HIGH,Count,1)];
   double dn=Low[iLowest(NULL,0,MODE_LOW,Count,1)];

   if(TrailingStop>0) Trailing();

   if((Ask-Bid)<Spred*Point)
  
     {
      if(CountOrders(2)<1 && Bid>up)
      {
       for(i=0;i<Counts;i++)
        {
        PutOrder(2,Bid-Delta*_Point-i*Delta*_Point*KLot);
        }
      }
     
       
    
     
      if(CountOrders(3)<1 && Ask<dn) 
       {
       for(i=0;i<Counts;i++)
        {
         PutOrder(3,Ask+Delta*_Point+i*Delta*_Point*KLot);
        }
       
       }
     }
 //  if(CountTrades()>0) DelOrder();
  }
//+------------------------------------------------------------------+
avatar

axe44

  • 5 августа 2018, 22:12
0
Скинь что есть, я посмотрю что получилось, подкорректирую отправлю всем.
avatar

axe44

  • 5 августа 2018, 20:28
+1
дай-дай-дай. хочу-хочу-хочу.
avatar

axe44

  • 30 июля 2018, 18:09
0
могу оплатить такую логику, если сова по 10 % делать будет с просадкой до 20%
avatar

axe44

  • 29 июля 2018, 23:04
0
Я написал в коде, что я избавился от замка. Получаем мартингейл в обе стороны.
Проверить очень просто. Оставляем только замок и на выходе слив, но если оставить увеличение лотности по мере увеличения просадки — получаем прибыль с меньшей просадкой.
Но сам по себе любой мартингейл когда нибудь начнёт сливать. Поэтому нужно лучше думать как выставить по движению ордера.
avatar

axe44

  • 29 июля 2018, 21:52
0
www.mql5.com/ru/signals/383802 тут используется сетка стоп ордеров. С минимальной просадкой всё время в плюсе.
Кто поможет разгадать логику совы?
avatar

axe44

  • 29 июля 2018, 21:35
0
исправь
avatar

axe44

  • 29 июля 2018, 21:28
+1

   if(CountTrades()>0 && FindOrderType()==1 && (Bid-FindLastSellPrice())/Point>=Step)
     {
     // PutOrder(0,Ask);
      PutOrder(1,Bid);
      ModifyOrders(0);
      ModifyOrders(1);
     }

   if(CountTrades()>0 && FindOrderType()==0 && (FindLastBuyPrice()-Ask)/Point>=Step)
     {
    //  PutOrder(1,Bid);
      PutOrder(0,Ask);
      ModifyOrders(1);
      ModifyOrders(0);
     }

так меньше просадка
avatar

axe44

  • 29 июля 2018, 21:26
+1
3 раза. Первый в множите лота: у тебя раньше стояло возведение в степень (Окси до сих пор пользуется советником с такой ошибкой), второй раз в названии сайта внутри робота, третий вот сейчас, могу сказать где ошибка в логике у заказчика, но это уже будет совсем другой советник и не твоя ошибка.
avatar

axe44

  • 29 июля 2018, 21:19
0
Андрей, сколько ещё ошибок я у тебя найду? Хоть бы раз спасибо сказал…
void ModifyOrders(int type)
  {
   double all=0,count=0,sl=0,tp=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type)
              {
               all+=OrderOpenPrice();
               count++;
              }
           }
        }
     }
avatar

axe44

  • 29 июля 2018, 19:56
0
это что за пара и время?
avatar

axe44

  • 29 июля 2018, 08:06
0

Собрал как получилось. Со стандартным набором сливает. При оптимизации получается какая то прибыль.
Прошу поискать ошибки, добавить функционал, изменить набор функций.
Сам советник:
//+------------------------------------------------------------------+
//|                                                     лимитник.mq4 |
//|                                            Copyright 2018, axe44 |
//|                                 http://axe44.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, axe44"
#property link      "http://axe44.opentraders.ru/bio/"
#property version   "4.00"
#property strict

//--- Inputs
extern double Lots        = 0.1;      // лот
extern int Times          = 30;       // время жизни ордеров
extern int StopLoss       = 30;      // лось
extern int TakeProfit     = 70;      // язь
//extern bool Tr            = 0;        // Обычный трал да/нет
extern int MA             = 40;       // длинна МА
extern bool Stop          = 0;        // Стоп ордера
extern bool Limit         = 1;        // Лимит ордера
extern int Spred          = 4;       // спред 
extern int steps          = 50;      // отступ 
extern int Slip           = 30;       // реквот
extern int Magic          = 123;      // магик

datetime t=1;double xx,yy,zz;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() //так приблизительно должно выглядеть
  {
//---
   if(Digits==3 || Digits==5)
     {
      TakeProfit*=10;
      StopLoss*=10;
      steps*=10;
      Slip*=10;
      Spred*=10;
     // NoLoss1*=10;
     // MinProfit*=10;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//Берём уровень текущую цену за основу, и пусть это будет икс. Берём скользящую среднию цену за игрек. 
//Так же нам нужны такие величины как время в днях, шаг. 
//Если икс больше/меньше скользящей средней на шаг, то выставляем стоп ордер, прописав время его жизни
//TimeCurrent()+60*60*60*24* время в днях
//в днях, прибыль и лося. Выставляем ордер через час/четыре часа/день по усмотрению.                                                                   |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;
    

   if(type==5||type==3)
     {
      clr=Red;
      if(steps>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(steps>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
      r=OrderSend(NULL,type,Lots,price,Slip,sl,tp,"",Magic,TimeCurrent()+Times*60*60,clr);// время истечения TimeCurrent()+Times*60*60
      
     }
   if(type==2||type==4)
     {
      clr=Blue;
      if(steps>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(steps>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
      r=OrderSend(NULL,type,Lots,price,Slip,sl,tp,"",Magic,TimeCurrent()+Times*60*60,clr);
     
     } 

  
   return;
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   
 if(t!=Time[0]&&(Ask-Bid)<Spred*Point)
 {
 
 NormalizeDouble(xx=Bid,Digits);
 NormalizeDouble(yy=iMA(NULL,0,MA,0,MODE_SMMA,PRICE_MEDIAN,0),Digits);
 NormalizeDouble(zz=xx-yy,Digits);
 if(xx<yy)NormalizeDouble(zz=yy-xx,Digits);
//Если икс больше/меньше скользящей средней на шаг, то выставляем стоп ордер и лимит, прописав время его жизни
   Print("длинна отступа ",steps*Point,", разница равна ",zz);
   if( AccountBalance()>300) if(zz>steps*Point)
     {
      if (Stop==1)
      if (xx<yy){ PutOrder(4,NormalizeDouble(yy+StopLoss*Point,Digits));}
      if (Limit==1)
      if (xx<yy){ PutOrder(3,NormalizeDouble(yy,Digits));}
      if (Stop==1)
      if (xx>yy){ PutOrder(5,NormalizeDouble(yy-StopLoss*Point,Digits));}
      if (Limit==1)
      if (xx>yy){ PutOrder(2,NormalizeDouble(yy,Digits));}
     }
       

      t=Time[0];   
   }
    
}
      
avatar

axe44

  • 28 июля 2018, 18:47
0
просто сказать что устал трудно?
avatar

axe44

  • 28 июля 2018, 12:18
0
читай договор внимательней. тех. задание должно быть написано понятно.
avatar

axe44

  • 27 июля 2018, 13:13