Группа "Стол заказов MQL"

Рейтинг 2089



РЕКОМЕНДУЮ



А можно 2 в одном?

Нужно в сеточный скрипт добавить возможность открытия первого ордера не с того места, куда скрипт брошен мышью, а с текущей цены. То есть просто щёлкаем по скрипту и он открывает первый ордер с текущей цены, а остальные согласно задаваемым параметрам.
Сам скрипт:
#property copyright "Copyright © 2012, Хлыстов Владимир"
#property link      ""
#property show_inputs
/*--------------------------------------------------------------------
скрипт определяет цену, куда мы его бросили и от нее строит сеть отложенных ордеров
если ниже цены, то BuyLimit, если выше, то SellLimit 
//--------------------------------------------------------------------*/
extern int      Step           = 50;       //расстояние (в пунктах) между ордерами
extern int      Orders         = 5;        //кол-во ордеров сетки
extern int      Magic          = 0;        //уникальный номер ордера

extern double   Lot            = 0.01;      //объем первого Stop ордера
extern double   K_Lot          = 1;        //умножение лота Stop ордеров 
extern double   PlusLot        = 0.00;      //прибавлять это значение к лоту последующих ордеров
extern double   MinusLot       = 0.00;      //отнимать это значение от лота предыдущего ордера

extern int      DigitsLot      = 2;        //округление значения лота

extern int      stoploss       = 0;       //уровень выставления SL, если 0, то SL не выставляется
extern int      takeprofit     = 0;      //уровень выставления TP, если 0, то TP не выставляется
extern int      Expiration     = 0;     //Срок истечения отложенного ордера в минутах, если 0, то срок не ограничен (1440 - сутки)
extern int      attempts       = 10;       //кол-во попыток открытия ордера 
//--------------------------------------------------------------------
string txt;
int n,slippage=3,STOPLEVEL;
datetime expiration;
//--------------------------------------------------------------------
int start()
{
   if (Expiration>0) expiration=TimeCurrent()+Expiration*60; else expiration=0;
   STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   if (Digits==3 || Digits==5) slippage=30;
   double Price;
   double LOT=Lot;
   
   Price = NormalizeDouble(WindowPriceOnDropped(),Digits);
   
   for (int i=1; i<=Orders; i++)
   {
      if (Price<Bid)
      {
         OPENORDER (OP_BUYLIMIT,Price,LOT,i);
         Price = NormalizeDouble(Price-Step*Point,Digits);
      }
      if (Price>Ask)
      {  
         OPENORDER (OP_SELLLIMIT,Price,LOT,i);
         Price = NormalizeDouble(Price+Step*Point,Digits);
      }
      LOT=NormalizeDouble(LOT*K_Lot+PlusLot-MinusLot,DigitsLot);
   }
return(0);
}
//--------------------------------------------------------------------
void OPENORDER(int ord,double Price,double L,int i)
{
   int error,err;
   double SL,TP;
   while (true)
   {  error=0;
      if (ord==OP_BUYSTOP) 
      {
         if (takeprofit!=0) TP  = NormalizeDouble(Price + takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL  = NormalizeDouble(Price - stoploss*Point,Digits); else SL=0;     
         error=OrderSend(Symbol(),ord, L,Price,slippage,SL,TP,"",Magic);
      }
      if (ord==OP_SELLSTOP) 
      {
         if (takeprofit!=0) TP = NormalizeDouble(Price - takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL = NormalizeDouble(Price + stoploss*Point,Digits);  else SL=0;              
         error=OrderSend(Symbol(),ord,L,Price,slippage,SL,TP,"",Magic);
      }
      if (ord==OP_SELLLIMIT) 
      {
         if (takeprofit!=0) TP = NormalizeDouble(Price - takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL = NormalizeDouble(Price + stoploss*Point,Digits);  else SL=0;              
         error=OrderSend(Symbol(),ord, L,Price,slippage,SL,TP,"",Magic);
      }
      if (ord==OP_BUYLIMIT) 
      {
         if (takeprofit!=0) TP  = NormalizeDouble(Price + takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL  = NormalizeDouble(Price - stoploss*Point,Digits); else SL=0;     
         error=OrderSend(Symbol(),ord,L,Price,slippage,SL,TP,"",Magic);
      }
      if (error==-1)
      {  
         txt=StringConcatenate(txt,"\nError ",GetLastError());
         if (ord==OP_BUYSTOP)   txt = StringConcatenate(txt,"  OPENORDER BUYSTOP ",  i,"   Ask =",DoubleToStr(Ask,Digits),"   Lot =",DoubleToStr(L,DigitsLot),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Price-Ask)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((Price-SL)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((TP-Price)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         if (ord==OP_SELLSTOP)  txt = StringConcatenate(txt,"  OPENORDER SELLSTOP ", i,"   Bid =",DoubleToStr(Bid,Digits),"   Lot =",DoubleToStr(L,DigitsLot),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Bid-Price)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((SL-Price)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((Price-TP)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         if (ord==OP_SELLLIMIT) txt = StringConcatenate(txt,"  OPENORDER SELLLIMIT ",i,"   Ask =",DoubleToStr(Ask,Digits),"   Lot =",DoubleToStr(L,DigitsLot),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Price-Ask)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((Price-SL)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((TP-Price)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         if (ord==OP_BUYLIMIT)  txt = StringConcatenate(txt,"  OPENORDER BUYLIMIT ", i,"   Bid =",DoubleToStr(Bid,Digits),"   Lot =",DoubleToStr(L,DigitsLot),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Bid-Price)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((SL-Price)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((Price-TP)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         Print(txt);
         Comment(txt,"  ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
         err++;Sleep(1000);RefreshRates();
      }
      else 
      {
         n++;
         return;
      }
      if (err>attempts) return;
   }
return;
}

Надеюсь, что мозгов разделить его потом на 2(отдельно для бай и селл) у меня хватит.

И нужен простенький(ну как мне кажется) советник закрывашка входящих в рынок ордеров. Суть его такова, что он должен выставлять общий тейкпрофит задаваемым количеством пипс только худшим по котировке ордерам по задаваемому параметру.

Пример:

-Допустим параметр 1. Соответственно сов при одном ордере в рынке выставляет ему задаваемый тейк(пусть будет 10пипс). При вхождении последующих ордеров в рынок до сработки тейка устанавливает им усреднённый тейк с заданным параметром(те же самые 10 пипс), исключая самый дальний.

-Меняем этот же параметр на 2. Соответственно сов при одном ордере в рынке курит бамбук. При вхождении 2го ордера в рынок устанавливает первому ордеру тейк с заданным параметром(те же самые 10 пипс). При вхождении в рынок 3го ордера отдыхает(т. е. не предпринимает ничего). При вхождении в рынок 4го ордера нижним 2м(1му и 2му) устанавливает им усреднённый тейк с заданным параметром(те же самые 10 пипс), исключая 3й и 4й ордера. При вхождении в рынок 5го ордера отдыхает. При вхождении в рынок 6го ордера нижним 3м(1му, 2му и 3му) устанавливает усреднённый тейк с заданным параметром(те же самые 10 пипс), исключая 3й, 5й и 6й ордера.

И так далее.

Ещё один параметр на общее количество ордеров в рынке, по достижении которого он бы просто выключался

P. S. Если я лихачнул с заявкой, то прошу начать с советника, а скрипт отложить на потом.
  • 0
  • Просмотров: 5330
  • 12 января 2016, 15:56
  • Anatoly74
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Советник, на пробой азиатской сессии.
Следующая запись в группе  
Exp__CloseLose_Positions
10 января 2016
12 января 2016

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

+
0
-Меняем этот же параметр на 2. Соответственно сов при одном ордере в рынке курит бамбук. При вхождении 2го ордера в рынок устанавливает первому ордеру тейк с заданным параметром(те же самые 10 пипс). При вхождении в рынок 3го ордера отдыхает(т. е. не предпринимает ничего). При вхождении в рынок 4го ордера нижним 2м(1му и 2му) устанавливает им усреднённый тейк с заданным параметром(те же самые 10 пипс), исключая 3й и 4й ордера. При вхождении в рынок 5го ордера отдыхает. При вхождении в рынок 6го ордера нижним 3м(1му, 2му и 3му) устанавливает усреднённый тейк с заданным параметром(те же самые 10 пипс), исключая 3й, 5й и 6й ордера.


И нужен простенький(ну как мне кажется)


Это только кажется.

1. 1 ордер — нет действий
2. 2 ордера — тейк первому
3. 3 ордера — нет действий
4. 4 ордера — первым двум усредненный тейк. N — всего, тейк N-2
5. 5 ордеров — нет действий
6. 6 ордеров — усредненный тейк N-3

Алгоритм. Советник включается, когда в рынке четное количество поз и вешает тейк по формуле: N/2 ордерам, где N — где N общее количество поз.

Так получается?
avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 12 января 2016, 18:25
+
0
Это только кажется.

Так мне не стремается признаться, что я в некоторых вещах более, чем бестолков))), поэтому и пришпилена P.S.ка
Параметр 1.
1 ордер — задаваемый тейк сразу же.
Каждый последующий ордер идёт в усреднение.

Меняем этот же параметр на 2.
1. 1 ордер — нет действий
2. 2 ордера — тейк первому
3. 3 ордера — нет действий
4. 4 ордера — первым двум усредненный тейк. N — всего, тейк N-2
5. 5 ордеров — нет действий
6. 6 ордеров — усредненный тейк N-3.

Меняем этот же параметр на 3.
1. 1 ордер — нет действий
2. 2 ордера — нет действий
3. 3 ордера — тейк первому
4. 4 ордера — нет действий
5. 5 ордеров — нет действий
6. 6 ордеров — усредненный тейк N-4.

И так далее.


P. S. Андрей, нужен ещё один параметр на отключение советника, допустим 10, то есть, если в рынок вошло 10 и более ордеров одного направления, то советник умирает до перезапуска.
Редактирован: 12 января 2016, 19:32
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 12 января 2016, 18:46
+
0
Пока сырой набросок. Ставит общий тейк на все ордера параметр 0 и на первую половину открытых ордеров если количество четное.




//+------------------------------------------------------------------+
//|                                                      MidTake.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

input int    StopLoss    = 3000; // стоп лосс ордера
input int    TakeProfit  = 10;   // тейк профит ордера
input int    Param       = 0;    // 0-All. 1-N/2.
input int    Count       = 10;   // количество ордеров которое считает советник
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode(int ord)
  {
   double all=0;
   double count=0,tp=0,sl=0;

   for(int i=ord-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               all+=OrderOpenPrice()*OrderLots();
               count+=OrderLots();
              }
           }
        }
     }
   all=NormalizeDouble(all/count,Digits);

   for(int i=ord-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               tp=NormalizeDouble(all+TakeProfit*Point,Digits);
               sl=NormalizeDouble(all-StopLoss*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);

              }
            else
            if(OrderType()==OP_SELL)
              {
               tp=NormalizeDouble(all-TakeProfit*Point,Digits);
               sl=NormalizeDouble(all+StopLoss*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double pr)
  {
   int r=0;
   color clr=clrNONE;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,0.1,NormalizeDouble(pr,Digits),0,0,0,"",0,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<=Count)
     {
      if(Param==0 && CountTrades()>0) Mode(CountTrades());
      if(Param==1 && CountTrades()>1 && MathMod(CountTrades(),2)==0) Mode(CountTrades()/2);
     }
     
   if(IsTesting())
     {
      if(OrdersTotal()<1)
        {
         for(int i=1;i<=10;i++)
           {
            PutOrder(5,Bid-200*Point*i);
           }
        }
     }

   Comment("\n Остаток: ",MathMod(CountTrades(),2));
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 12 января 2016, 20:30
+
0
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 12 января 2016, 21:03
+
0
Там 1000 тейк стоит а иначе сразу закрываются.
avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 12 января 2016, 21:05
+
0
иначе сразу закрываются.

Так это и нужно.
Для данной ситуации:
При параметре 1 один верхний ордер должен остаться в рынке, а нижние 9 должны убиться в бу +10 пипс.
При параметре 2 пять верхних должны остаться в рынке, а нижние 5 должны убиться в бу +10 пипс.
При параметре 3 семь верхних должны остаться в рынке, а нижние 3 должны убиться в бу +10 пипс.
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 12 января 2016, 21:15
+
0
Смоделировал в тестере для 1-го параметра:

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 12 января 2016, 22:13
+
0
Опять морока с модификацией, сыпет ошибку 130.
Не работает эта функция:


void Mode1()
  {
   double tp=0;

   for(int i=OrdersTotal()-1;i>=5;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               tp=NormalizeDouble(OrderOpenPrice()+TakeProfit*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),0,tp,0,Yellow);
              }
            else
            if(OrderType()==OP_SELL)
              {
               tp=NormalizeDouble(OrderOpenPrice()-TakeProfit*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),0,tp,0,Yellow);
              }
           }
        }
     }
  }



//+------------------------------------------------------------------+
//|                                                      MidTake.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

input int    StopLoss    = 3000; // стоп лосс ордера
input int    TakeProfit  = 10;   // тейк профит ордера
input int    Param       = 0;    // 0-All. 1-N/2.
input int    Count       = 10;   // количество ордеров которое считает советник
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode(int from,int to)
  {
   double all=0;
   double count=0,tp=0,sl=0;

   for(int i=to-1;i>=from;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               all+=OrderOpenPrice();
               count++;
              }
           }
        }
     }
   if(count>0) all=NormalizeDouble(all/count,Digits);

   for(int i=to-1;i>=from;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY && OrderStopLoss()==0)
              {
               tp=NormalizeDouble(all+TakeProfit*Point,Digits);
               sl=NormalizeDouble(all-StopLoss*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
            else
            if(OrderType()==OP_SELL && OrderStopLoss()==0)
              {
               tp=NormalizeDouble(all-TakeProfit*Point,Digits);
               sl=NormalizeDouble(all+StopLoss*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode1()
  {
   double tp=0;

   for(int i=OrdersTotal()-1;i>=5;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               tp=NormalizeDouble(OrderOpenPrice()+TakeProfit*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),0,tp,0,Yellow);
              }
            else
            if(OrderType()==OP_SELL)
              {
               tp=NormalizeDouble(OrderOpenPrice()-TakeProfit*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),0,tp,0,Yellow);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double pr)
  {
   int r=0;
   color clr=clrNONE;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,0.1,NormalizeDouble(pr,Digits),0,0,0,"",0,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<=Count)
     {
      if(Param==0 && CountTrades()>1) Mode(1,CountTrades());
      if(Param==1 && Bid<1.12435) Mode1();
     }

   if(IsTesting())
     {
      if(OrdersTotal()<1)
        {
         for(int i=1;i<=10;i++)
           {
            PutOrder(5,Bid-200*Point*i);
           }
        }
     }

   Comment("\n Остаток: ",MathMod(CountTrades(),2),
           "\n Позиций: ",CountTrades());
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 12 января 2016, 23:15
+
0
Сделал пока такой вариант. Указываем сколько верхних должно остаться, нижние уходят в БУ а верхние остаются.







//+------------------------------------------------------------------+
//|                                                      MidTake.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

input int    StopLoss    = 3000; // стоп лосс ордера
input int    TakeProfit  = 10;   // тейк профит ордера
input int    Orders      = 3;    // сколько ордеров оставляем
input int    Count       = 10;   // количество ордеров которое считает советник
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode(int from,int to)
  {
   double all=0;
   double count=0,tp=0,sl=0;

   for(int i=to-1;i>=from;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               all+=OrderOpenPrice();
               count++;
              }
           }
        }
     }
   if(count>0) all=NormalizeDouble(all/count,Digits);

   for(int i=to-1;i>=from;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY && OrderStopLoss()==0)
              {
               tp=NormalizeDouble(all+TakeProfit*Point,Digits);
               sl=NormalizeDouble(all-StopLoss*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
            else
            if(OrderType()==OP_SELL && OrderStopLoss()==0)
              {
               tp=NormalizeDouble(all-TakeProfit*Point,Digits);
               sl=NormalizeDouble(all+StopLoss*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double pr)
  {
   int r=0;
   color clr=clrNONE;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,0.1,NormalizeDouble(pr,Digits),0,0,0,"",0,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<=Count)
     {
      Mode(Orders,CountTrades());
     }

   if(IsTesting())
     {
      if(OrdersTotal()<1)
        {
         for(int i=1;i<=10;i++)
           {
            PutOrder(5,Bid-200*Point*i);
           }
        }
     }

   Comment("\n Остаток: ",MathMod(CountTrades(),2),
           "\n Позиций: ",CountTrades());
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 13 января 2016, 00:42
+
0
Скрипт поправил:




//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Хлыстов Владимир"
#property link      ""
#property show_inputs
/*--------------------------------------------------------------------
скрипт определяет цену, куда мы его бросили и от нее строит сеть отложенных ордеров
если ниже цены, то BuyLimit, если выше, то SellLimit 
//--------------------------------------------------------------------*/
extern int      Step           = 50;       //расстояние (в пунктах) между ордерами
extern int      Orders         = 5;        //кол-во ордеров сетки
extern int      Type           = 1;        //1-BuyLimit 2-SellLimit
extern int      Magic          = 0;        //уникальный номер ордера

extern double   Lot=0.01;      //объем первого Stop ордера
extern double   K_Lot=1;        //умножение лота Stop ордеров 
extern double   PlusLot        = 0.00;      //прибавлять это значение к лоту последующих ордеров
extern double   MinusLot       = 0.00;      //отнимать это значение от лота предыдущего ордера

extern int      DigitsLot=2;        //округление значения лота

extern int      stoploss=0;       //уровень выставления SL, если 0, то SL не выставляется
extern int      takeprofit=0;      //уровень выставления TP, если 0, то TP не выставляется
extern int      Expiration= 0;     //Срок истечения отложенного ордера в минутах, если 0, то срок не ограничен (1440 - сутки)
extern int      attempts=10;       //кол-во попыток открытия ордера 
//--------------------------------------------------------------------
string txt;
int n,slippage=3,STOPLEVEL;
datetime expiration;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|        Deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if(Expiration>0) expiration=TimeCurrent()+Expiration*60; else expiration=0;
   STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   if(Digits==3 || Digits==5) slippage=30;
   double Price;
   double LOT=Lot;

   Price=NormalizeDouble(Close[0],Digits);

   for(int i=1; i<=Orders+1; i++)
     {
      if(Type==1)
        {
         OPENORDER(OP_BUYLIMIT,Price,LOT,i);
         Price=NormalizeDouble(Price-Step*Point,Digits);
        }
      if(Type==2)
        {
         OPENORDER(OP_SELLLIMIT,Price,LOT,i);
         Price=NormalizeDouble(Price+Step*Point,Digits);
        }
      LOT=NormalizeDouble(LOT*K_Lot+PlusLot-MinusLot,DigitsLot);
     }
   return(0);
  }
//--------------------------------------------------------------------
void OPENORDER(int ord,double Price,double L,int i)
  {
   int error,err;
   double SL,TP;
   while(true)
     {
      error=0;
      if(ord==OP_BUYSTOP)
        {
         if(takeprofit!=0) TP=NormalizeDouble(Price+takeprofit*Point,Digits); else TP=0;
         if(stoploss!=0) SL=NormalizeDouble(Price-stoploss*Point,Digits); else SL=0;
         error=OrderSend(Symbol(),ord,L,Price,slippage,SL,TP,"",Magic);
        }
      if(ord==OP_SELLSTOP)
        {
         if(takeprofit!=0) TP=NormalizeDouble(Price-takeprofit*Point,Digits); else TP=0;
         if(stoploss!=0) SL=NormalizeDouble(Price+stoploss*Point,Digits);  else SL=0;
         error=OrderSend(Symbol(),ord,L,Price,slippage,SL,TP,"",Magic);
        }
      if(ord==OP_SELLLIMIT)
        {
         if(takeprofit!=0) TP=NormalizeDouble(Price-takeprofit*Point,Digits); else TP=0;
         if(stoploss!=0) SL=NormalizeDouble(Price+stoploss*Point,Digits);  else SL=0;
         error=OrderSend(Symbol(),ord,L,Price,slippage,SL,TP,"",Magic);
        }
      if(ord==OP_BUYLIMIT)
        {
         if(takeprofit!=0) TP=NormalizeDouble(Price+takeprofit*Point,Digits); else TP=0;
         if(stoploss!=0) SL=NormalizeDouble(Price-stoploss*Point,Digits); else SL=0;
         error=OrderSend(Symbol(),ord,L,Price,slippage,SL,TP,"",Magic);
        }
      if(error==-1)
        {
         txt=StringConcatenate(txt,"\nError ",GetLastError());
         if(ord==OP_BUYSTOP)   txt = StringConcatenate(txt,"  OPENORDER BUYSTOP ",  i,"   Ask =",DoubleToStr(Ask,Digits),"   Lot =",DoubleToStr(L,DigitsLot),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Price-Ask)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((Price-SL)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((TP-Price)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         if(ord==OP_SELLSTOP)  txt = StringConcatenate(txt,"  OPENORDER SELLSTOP ", i,"   Bid =",DoubleToStr(Bid,Digits),"   Lot =",DoubleToStr(L,DigitsLot),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Bid-Price)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((SL-Price)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((Price-TP)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         if(ord==OP_SELLLIMIT) txt = StringConcatenate(txt,"  OPENORDER SELLLIMIT ",i,"   Ask =",DoubleToStr(Ask,Digits),"   Lot =",DoubleToStr(L,DigitsLot),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Price-Ask)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((Price-SL)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((TP-Price)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         if(ord==OP_BUYLIMIT)  txt = StringConcatenate(txt,"  OPENORDER BUYLIMIT ", i,"   Bid =",DoubleToStr(Bid,Digits),"   Lot =",DoubleToStr(L,DigitsLot),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Bid-Price)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((SL-Price)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((Price-TP)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         Print(txt);
         Comment(txt,"  ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
         err++;Sleep(1000);RefreshRates();
        }
      else
        {
         n++;
         return;
        }
      if(err>attempts) return;
     }
   return;
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 13 января 2016, 02:46
+
0
Сделал пока такой вариант. Указываем сколько верхних должно остаться, нижние уходят в БУ а верхние остаются.

Такое у меня уже есть. Не нравится тем, что риски разные, а результат одинаков. Может возможно параметр на закрытие худших ордеров сделать процентным?
Если допустим ставим 50%, вошло в рынок шесть ордеров — бу втыкается трём худшим, вошло десять — бу втыкается пяти худшим.
Если ставим 40%, вошло в рынок пять ордеров — бу втыкается двум худшим, вошло десять — бу втыкается четырём худшим.
Скрипт поправил.

За скрипт спасибо, уже лучше. А его никак не научить 1й ордер открывать рыночным, а остальную сеть достраивать лимитками?
Редактирован: 13 января 2016, 13:30
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 13 января 2016, 05:28
+
0
А его никак не научить 1й ордер открывать рыночным, а остальную сеть достраивать лимитками?


Лучше напишу с нуля, так проще чем искать и править чужой код.
avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 13 января 2016, 21:56
+
0
Этот и править потом одно удовольствие <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp;  www.opentraders.ru/downloads/1010/

//--- Inputs
extern double Lots      = 0.1;      // лот
extern int StopLoss     = 0;        // лось
extern int TakeProfit   = 0;        // язь
extern int StopLimit    = 3;        // 0-бай и байлимит. 1-селл и селллимит. 2-бай и байстоп. 3-селл и селлстоп
extern int Slip         = 3;        // реквот
extern int Step         = 100;      // шаг ордеров
extern int Count        = 5;        // количество ордеров
extern int Magic        = 123;      // магик


Редактирован: 13 января 2016, 22:31
avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 13 января 2016, 22:30
+
0
Может возможно параметр на закрытие худших ордеров сделать процентным?
Если допустим ставим 50%, вошло в рынок шесть ордеров — бу втыкается трём худшим, вошло десять — бу втыкается пяти худшим.
Если ставим 40%, вошло в рынок пять ордеров — бу втыкается двум худшим, вошло десять — бу втыкается четырём худшим.


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

Та же версия советника выведет в бу указанные ордера если цена развернулась.

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 14 января 2016, 01:41
+
0
Скрипт как то через раз(плавающий баг) при построении сеток открывает 2 рыночных ордера.



Ещё бы вот это добавить:

extern double PlusLot = 0.00; //прибавлять это значение к лоту последующих ордеров
extern double MinusLot = 0.00; //отнимать это значение от лота предыдущего ордера

И убрать функцию оставления меток.

Была бы совсем красота.

По советнику попробую позже графически изложить.
Редактирован: 14 января 2016, 11:29
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 14 января 2016, 07:50
+
0
Добавил увеличение лота и удаление меток:




//+------------------------------------------------------------------+
//|                                              StopLimitOrders.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property show_inputs

//--- Inputs
extern double  Lot      = 0.01;     //объем первого ордера
extern double  KLot     = 1;        //умножение лота Stop ордеров 
extern double  PlusLot  = 0.01;     //прибавлять это значение к лоту последующих ордеров
extern double  MinusLot = 0.00;     //отнимать это значение от лота предыдущего ордера

extern int StopLoss     = 0;        // лось
extern int TakeProfit   = 0;        // язь
extern int StopLimit    = 3;        // 0-бай и байлимит. 1-селл и селллимит. 2-бай и байстоп. 3-селл и селлстоп
extern int DigitsLot    = 2;        // округление значения лота
extern int Slip         = 3;        // реквот
extern int Step         = 100;      // шаг ордеров
extern int Count        = 5;        // количество ордеров
extern int Magic        = 123;      // магик

double lot=Lot;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   Comment("");
   ObjectsDeleteAll();
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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,lot,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   if(StopLimit==0)
     {
      PutOrder(0,Ask);
      for(int i=0; i<=Count;i++)
        {
         PutOrder(2,Ask-Step*Point*i);
         lot=NormalizeDouble(lot*KLot+PlusLot-MinusLot,DigitsLot);
        }
     }

   if(StopLimit==1)
     {
      PutOrder(1,Bid);
      for(int i=0; i<=Count;i++)
        {
         PutOrder(3,Bid+Step*Point*i);
         lot=NormalizeDouble(lot*KLot+PlusLot-MinusLot,DigitsLot);
        }
     }

   if(StopLimit==2)
     {
      PutOrder(0,Ask);
      for(int i=0; i<=Count;i++)
        {
         PutOrder(4,Ask+Step*Point*i);
         lot=NormalizeDouble(lot*KLot+PlusLot-MinusLot,DigitsLot);
        }
     }

   if(StopLimit==3)
     {
      PutOrder(1,Bid);
      for(int i=0; i<=Count;i++)
        {
         PutOrder(5,Bid-Step*Point*i);
         lot=NormalizeDouble(lot*KLot+PlusLot-MinusLot,DigitsLot);
        }
     }

  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 14 января 2016, 11:51
+
+1
Поправил скрипт: www.opentraders.ru/downloads/1010/

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 18 января 2016, 03:50
+
0
Благодарствую.
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 18 января 2016, 05:34
+
0
Скрипт меня полностью устраивает.

Что касается советника, графически изобразить мне показалось сложновато, попробую описать алгоритм словами:

Если параметр 0 — на все входящие в рынок ордера ставит бу + задаваемое кол-во пипс.

Если параметр 1, в рынке один ордер — ничего, два ордера — худшему тейк бу+пипс, три ордера — ничего, четыре ордера-2м худшим бу+пипс, пятый ордер — ничего, шестой ордер-3м худшим бу+пипс и так далее.

Если параметр 2, в рынке один ордер — ничего, второй ордер — ничего, третий ордер — худшему бу + пипс, четвёртый ордер — ничего, пятый ордер — ничего, шестой ордер — худшим 2м — бу + пипс и так далее.

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

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 21 января 2016, 14:04
+
0
Что касается советника, графически изобразить мне показалось сложновато, попробую описать алгоритм словами:


Анатолий, хотя бы калябушки в пайнте. Мне ведь четко нужно представлять всю картину.
avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 22 января 2016, 02:06
+
0
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 22 января 2016, 11:47
+
0
Покумекаю сегодня :) 
avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 23 января 2016, 02:08
+
0
*stesnitelno* 
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 24 января 2016, 16:00
+
0
Анатолий, сначала делал заказы попроще. Завтра уже смотреть буду. О результате напишу.
avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 24 января 2016, 17:32
+
0
С параметром 0 это легко делается, а вот как объяснить машине с параметрами 1 и 2, вот это вопрос?

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 24 января 2016, 18:40
+
0
Да вот кабы я знал ЕНтот язык машинный… Не на то училсУ в своё время.

Если сов как-то нумерует ведомые ордерки, может как-то можно ему подсказать, чтобы учитывал их через 1 или через 2?

P. S. Частенько бывает так и в реале: Придёшь в магазин, спросишь требуемое — нифига, всё есть, а этого нет, непруха одним словом.
Редактирован: 24 января 2016, 18:50
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 24 января 2016, 18:46
+
0
Если сов как-то нумерует ведомые ордерки, может как-то можно ему подсказать, чтобы учитывал их через 1 или через 2?


Можно смотреть по остатку от деления на 2.
avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 24 января 2016, 18:48
+
0
Можно смотреть по остатку от деления на 2.

Страшно далека уже арифметика, годов так на двадцать с лишком. Мне бы пощупать чего…

Предполагаю, что остаток деления на 2 это либо ноль, либо один…
Редактирован: 24 января 2016, 19:03
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 24 января 2016, 18:53
+
0
Ошибки модификации выловить осталось.
avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 24 января 2016, 19:46
+
0
Пока так. Он долбит по кругу на каждом тике, отсюда и ошибка, я пока не придумал как этот круг разорвать. на сегодня хватит, выходной все таки.


//+------------------------------------------------------------------+
//|                                                      MidTake.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

input int    StopLoss    = 3000; // стоп лосс ордера
input int    TakeProfit  = 10;   // тейк профит ордера
input int    Param       = 0;    // 
input int    Count       = 10;   // количество ордеров которое считает советник
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode(int from,int to)
  {
   double all=0;
   double count=0,tp=0,sl=0;

   for(int i=to-1;i>=from;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               all+=OrderOpenPrice();
               count++;
              }
           }
        }
     }
   if(count>0) all=NormalizeDouble(all/count,Digits);

   for(int i=to-1;i>=from;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               tp=NormalizeDouble(all+TakeProfit*Point,Digits);
               sl=NormalizeDouble(all-StopLoss*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
            else
            if(OrderType()==OP_SELL)
              {
               tp=NormalizeDouble(all-TakeProfit*Point,Digits);
               sl=NormalizeDouble(all+StopLoss*Point,Digits);
               bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
           }
        }
     }
   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())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double pr)
  {
   int r=0;
   color clr=clrNONE;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,0.1,NormalizeDouble(pr,Digits),0,0,0,"",0,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<=Count)
     {
      if(Param==0) Mode(0,CountTrades());

      if(Param==1)
        {
         if(CountTrades()==1) Mode(0,1);
         if(CountTrades()>1 && MathMod(CountTrades(),2)==0) Mode(0,CountTrades()/2);
        }

      if(Param==2)
        {
         if(CountTrades()>2 && MathMod(CountTrades(),3)==0) Mode(0,CountTrades()/3);
        }
     }

   if(IsTesting())
     {
      if(OrdersTotal()<1)
        {
         for(int i=1;i<=10;i++)
           {
            PutOrder(2,Ask-200*Point*i);
           }
        }
     }

   Comment("\n Остаток: ",MathMod(CountTrades(),3),
           "\n Позиций: ",CountTrades());
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 24 января 2016, 20:21
+
0
Спасибо, попробую погонять.
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 24 января 2016, 20:35
+
0
Поправил модификацию:




//+------------------------------------------------------------------+
//|                                                      MidTake.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

input int    StopLoss    = 3000; // стоп лосс ордера
input int    TakeProfit  = 10;   // тейк профит ордера
input int    Param       = 0;    // 
input int    Count       = 10;   // количество ордеров которое считает советник

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode(int from,int to)
  {
   bool m;
   double all=0;
   double count=0,tp=0,sl=0;

   for(int i=to-1;i>=from;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               all+=OrderOpenPrice();
               count++;
              }
           }
        }
     }
   if(count>0) all=NormalizeDouble(all/count,Digits);

   for(int i=to-1;i>=from;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               tp=NormalizeDouble(all+TakeProfit*Point,Digits);
               sl=NormalizeDouble(all-StopLoss*Point,Digits);
               if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp)
               m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
            else
            if(OrderType()==OP_SELL)
              {
               tp=NormalizeDouble(all-TakeProfit*Point,Digits);
               sl=NormalizeDouble(all+StopLoss*Point,Digits);
               if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp)
               m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
           }
        }
     }
   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())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double pr)
  {
   int r=0;
   color clr=clrNONE;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,0.1,NormalizeDouble(pr,Digits),0,0,0,"",0,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<=Count)
     {
      if(Param==0)
        {
         Mode(0,CountTrades());
        }

      if(Param==1)
        {
         if(CountTrades()==1) Mode(0,1);
         if(CountTrades()>1 && MathMod(CountTrades(),2)==0) Mode(0,CountTrades()/2);
        }

      if(Param==2)
        {
         if(CountTrades()>2 && MathMod(CountTrades(),3)==0) Mode(0,CountTrades()/3);
        }
     }

   if(IsTesting())
     {
      if(OrdersTotal()<1)
        {
         for(int i=1;i<=10;i++)
           {
            PutOrder(2,Ask-200*Point*i);
           }
        }
     }

   Comment("\n Остаток: ",MathMod(CountTrades(),3),
           "\n Позиций: ",CountTrades());
   return;
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 25 января 2016, 09:41
+
0
Андрей, что-то не то:



Тейк так и не выставил.
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 25 января 2016, 15:22
+
0
Тейк так и не выставил.


Значит надо ставить на отладку. Завтра поставлю.
avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 25 января 2016, 18:16
+
0
Анатолий, нужны логи с вкладок журнал и эксперты. Я только что поставил и уменя сразу сработал с параметром 1.

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 26 января 2016, 06:46
+
0
Отправил в скайп.
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 26 января 2016, 11:08

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