0
А вот сейчас больше стало похоже на правду:




//+------------------------------------------------------------------+
//|                                                        Kanal.mq4 |
//|                                              Copyright 2017, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
//--- Inputs
extern double Lots       = 0.1;      // торговый объем ордера
extern double MaxLot     = 5;        // максимальный торговый объем
extern double KLot       = 2;        // увеличение лота
extern double Price      = 1.19;     // цена

extern int StopLoss      = 500;      // лось
extern int TakeProfit    = 200;      // язь
extern int Delta         = 200;      // дельта
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

bool b=1,s=1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double lot)
  {
   int r=0;
   color clr=clrNONE;
   double sl=0,tp=0;
   datetime expiration=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);
   return;
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int type)
  {
   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()==type) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastType()
  {
   int tp=8;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) tp=OrderType();
            break;
           }
        }
     }
   return(tp);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LastLot()
  {
   double lt=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) lt=OrderLots();
            break;
           }
        }
     }
   return(lt);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(Bid>Price && CountTrades()<1)
     {
      if(CountOrders(3)<1) PutOrder(3,Bid+Delta*Point,Lots);
      if(CountOrders(2)<1) PutOrder(2,Bid-Delta*Point,Lots);
     }

   if(CountOrders(3)<1 && s)
     {
      DelOrder(2);
      if(CountOrders(2)<1) PutOrder(2,Price-Delta*Point,LastLot()*KLot);
      s=0;b=1;
     }

   if(CountOrders(2)<1 && b)
     {
      DelOrder(3);
      if(CountOrders(3)<1) PutOrder(3,Price+Delta*Point,LastLot()*KLot);
      b=0;s=1;
     }

   Comment("");
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 18 сентября 2017, 23:04
0
Я сделал набросок, но конца не видно даже. Однозначно к платному.




//+------------------------------------------------------------------+
//|                                                        Kanal.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//--- Inputs
extern double Lots       = 0.1;      // торговый объем ордера
extern double MaxLot     = 5;        // максимальный торговый объем
extern double KLot       = 2;        // увеличение лота
extern double Price      = 1.19;     // цена

extern int StopLoss      = 500;      // лось
extern int TakeProfit    = 200;      // язь
extern int Delta         = 200;      // дельта
extern int BuySell       = 0;        // 0-buy 1-sell 2-both
extern int Step          = 100;      // шаг
extern int Slip          = 30;       // реквот
extern bool MA           = false;    // фильтр
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double lot)
  {
   int r=0;
   color clr=clrNONE;
   double sl=0,tp=0;
   datetime expiration=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);
   return;
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int type)
  {
   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()==type) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastType()
  {
   int tp=8;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) tp=OrderType();
            break;
           }
        }
     }
   return(tp);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LastLot()
  {
   double lt=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) lt=OrderLots();
            break;
           }
        }
     }
   return(lt);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(Bid>Price && CountTrades()<1)
     {
      if(CountOrders(3)<1) PutOrder(3,Bid+Delta*Point,Lots);
      if(CountOrders(2)<1) PutOrder(2,Bid-Delta*Point,Lots);
     }

   if(CountOrders(3)<1)
     {
      DelOrder(2);
      if(CountOrders(2)<1) PutOrder(2,Price-Delta*Point,LastLot()*KLot);
     }

   if(CountOrders(2)<1)
     {
      DelOrder(3);
      if(CountOrders(3)<1) PutOrder(3,Price+Delta*Point,LastLot()*KLot);
     }

   Comment("");
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 18 сентября 2017, 22:16
0
Сложный советник, результат не гарантирую. Попробую сейчас что то набросать.
Еще скиньте скрин со входами, чтобы не было никаких разночтений.
avatar

AM2

  • 18 сентября 2017, 21:12
0
Посмотрите внимательно, как только появляется сигнал советник сразу открывает позу.
avatar

AM2

  • 18 сентября 2017, 20:59
0
Дайте ссылку на самый близкий вариант? Еще помню пользователю PetrovMaksim делал по заданной котировке, посмотрите у него в блоге.
avatar

AM2

  • 18 сентября 2017, 20:57
0
Нет не берусь я такую штуку дорабатывать, он и без того сложный.
avatar

AM2

  • 18 сентября 2017, 17:31
0
Так примерно. Даже в плюс после опта получилось :) 
Входы по условию, выходы по тралу и стопам.




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

//--- Inputs
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern int TrailingStop  = 0;        // трал
extern int Slip          = 30;       // реквот
extern int Shift         = 1;        // на каком баре сигнал индикатора
extern int MAPeriod      = 14;       // период MA 
extern int Delta         = 100;      // дельта
extern int Count         = 3;        // число свечей
extern int Magic         = 123;      // магик

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   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,0,clr);
   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()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MADelta()
  {

   double ma1=iMA(NULL,0,MAPeriod,0,0,0,Shift);
   double ma2=iMA(NULL,0,MAPeriod,0,0,0,Shift+Count);
   double delta=(ma1-ma2)/Point;
   return(delta);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   double ma=iMA(NULL,0,MAPeriod,0,0,0,Shift);

   if(MADelta()>Delta && Ask>ma)
     {
      PutOrder(0,Ask);
     }

   if(MADelta()<-Delta && Bid<ma)
     {
      PutOrder(1,Bid);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   for(int 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;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(t!=Time[0])
     {
      OpenPos();
      if(TrailingStop>0) Trailing();
      t=Time[0];
     }

   Comment("\n Delta: ",MADelta());
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 17 сентября 2017, 08:41
0
Опишите ТЗ с нуля. С чужим кодом не работаю.
avatar

AM2

  • 16 сентября 2017, 20:16
0
Попробуйте установить параметр шифт в 0.
avatar

AM2

  • 16 сентября 2017, 19:16
0
Поправил согласно первоначальному ТЗ: www.opentraders.ru/downloads/1657/

avatar

AM2

  • 16 сентября 2017, 16:55
0
После открытия ордера, допустим в SELL лотом 0.1 следующий ордер будет открыт с удвоением, но так же в направлении SELL. А ордер между ними открывшийся в BUY советник открывает начальным лотом. А нужно открыть удвоением согласно очередности: 1-йSell 0.1 2-й Sell 0.4 3-й Buy 0.6 и т.д.


А почему в начале об этом не было ни слова?
avatar

AM2

  • 16 сентября 2017, 16:38
0
Мог бы :)  Условия вы знаете.
avatar

AM2

  • 16 сентября 2017, 06:47
0
Платно не делаю. Можете здесь в топике назвать сумму которую готовы заплатить за заказ, программисты посмотрят и напишут вам в личку.
avatar

AM2

  • 16 сентября 2017, 06:44
0
Здесь есть много подобных, смотрите в базе. Один из вариантов мой Hedge Martin.
avatar

AM2

  • 16 сентября 2017, 06:41
0
Перевел, но надо по любому отладить в приложении которое использует эту функцию.


//+------------------------------------------------------------------+
//|                                                       SGN_MA.mqh |
//|                                              Copyright 2017, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, AM2"
#property link      "https://www.forexsystems.biz"
#property strict
//+------------------------------------------------------------------+
//|   Меню выбора определения нахождения/движения индикатора MA      |
//+------------------------------------------------------------------+
enum ENUM_MA_MODE
  {
   Intersection=0,
   Price=1,
   Napravlenie=2
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
extern string               MA_Info           = "Settings MA";    //Options
extern ENUM_TIMEFRAMES      MA_TimeFrame      = PERIOD_CURRENT;   //TimeFrame
extern int                  MA_Period         = 20;               //Period 
extern int                  MA_Shift          = 0;                //Shift
extern ENUM_MA_METHOD       MA_Method         = MODE_EMA;         //Method
extern int                  MA_Applied_Price  = PRICE_CLOSE;      //Applied price
extern int                  MA_Index          = 1;                //Index
extern ENUM_MA_MODE         MA_MODE           = Intersection;     //Definition mode
extern bool                 MA_Changeling     = false;            //Changeling

//--- глобальные переменные
int MAHandle;                  // Хэндл индикатора MA
double ma[3],open[1],close[1]; // Динамический массив для хранения численных значений МА
//+------------------------------------------------------------------+
//|        Initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Получаем хэндл индикаторa MA
//MAHandle=iMA(_Symbol,MA_TimeFrame,MA_Period,MA_Shift,MA_Method,MA_Applied_Price,MA_Index);
   MAHandle=iMA(_Symbol,MA_TimeFrame,MA_Period,MA_Shift,MA_Method,MA_Applied_Price);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int SGN_MA(string   symbol)
  {
//--- Определим соответствующее свойства для символа -----------------
   int      digits /* Количество знаков после запятой */ = (int) SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   double   point  /* Значение одного пункта */          =  SymbolInfoDouble(symbol,SYMBOL_POINT);
   double   bid    /* Лучшее предложение на продажу */   =  SymbolInfoDouble(symbol,SYMBOL_BID);
   double   ask    /* Лучшее предложение на покупку */   =  SymbolInfoDouble(symbol,SYMBOL_ASK);
//--------------------------------------------------------------------
//--- Инициализация переменых ----------------------------------------
   ENUM_TIMEFRAMES      timeframe      /* Таймфрейм */         = MA_TimeFrame;
   int                  ma_period      /* Период */            = MA_Period;
   int                  ma_shift       /* Сдвиг средней */     = MA_Shift;
   ENUM_MA_METHOD       ma_method      /* Метод усреднения */  = MA_Method;
   int                  applied_price  /* Тип цены */          = MA_Applied_Price;
   int                  shift          /* Сдвиг */             = MA_Index;
   bool                 changeling     /* Перевертыш включен */= MA_Changeling;
   int up,down;
//--------------------------------------------------------------------
#ifdef __MQL4__
   double MA=iMA(symbol,timeframe,ma_period,ma_shift,ma_method,applied_price,shift);
   double MA1 = iMA(symbol,timeframe,ma_period,ma_shift,ma_method,applied_price,shift+1);
   double MA2 = iMA(symbol,timeframe,ma_period,ma_shift,ma_method,applied_price,shift+2);
#endif
//--------------------------------------------------------------------
#ifdef __MQL5__
   CopyBuffer(MAHandle,0,0,3,ma);
#endif
//--------------------------------------------------------------------
   if(changeling==false)
     {
      up=1;
      down=-1;
     }
   else
     {
      up=-1;
      down=1;
     }
//--------------------------------------------------------------------
#ifdef __MQL4__
   switch(MA_MODE)
     {
      case  0:
         if(Open[shift] < MA && Close[shift] > MA)return(up);
         if(Open[shift] > MA && Close[shift] < MA)return(down);
         break;
      case  1:
         if(bid > MA && ask > MA)return(up);
         if(bid < MA && ask < MA)return(down);
         break;
      case  2:
         if(MA2 < MA && MA > MA1)return(up);
         if(MA2 > MA && MA < MA1)return(down);
         break;
      default:
         break;
     }
#endif
//--------------------------------------------------------------------
#ifdef __MQL5__
   CopyOpen(_Symbol,PERIOD_CURRENT,0,3,open);
   CopyClose(_Symbol,PERIOD_CURRENT,0,3,close);

   switch(MA_MODE)
     {
      case  0:
         if(open[shift] < ma[0] && close[shift] > ma[0])return(up);
         if(open[shift] > ma[0] && close[shift] < ma[0])return(down);
         break;
      case  1:
         if(bid > ma[0] && ask > ma[0])return(up);
         if(bid < ma[0] && ask < ma[0])return(down);
         break;
      case  2:
         if(ma[2] < ma[0] && ma[0] > ma[1])return(up);
         if(ma[2] > ma[0] && ma[0] < ma[1])return(down);
         break;
      default:
         break;
     }
#endif
//+------------------------------------------------------------------+
   return(0);
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 15 сентября 2017, 20:23
0
Напрямую из индикатора не вытащишь значения. Можно написать функцию считающую максимальный объем, но это не быстро, а с этим не ко мне.
avatar

AM2

  • 15 сентября 2017, 20:20
0
Нет такой бесплатно никто не будет делать.
avatar

AM2

  • 15 сентября 2017, 17:58
0
Не раньше чем через неделю буду смотреть.
avatar

AM2

  • 15 сентября 2017, 17:55