+1
Можно большую часть сейчас сделать, остальное в следующем топике и бесплатно.
avatar

AM2

  • 14 июля 2017, 17:20
0
Встроил увеличение лота после лося: www.opentraders.ru/downloads/1633/

if(AutoMM<0) LotSize=Lot();




avatar

AM2

  • 13 июля 2017, 19:00
0
Какого рода мартингейл вас интересует?
avatar

AM2

  • 13 июля 2017, 18:33
0
Умножение не работает. И ещё бы добавить трал, безубыток, и профит. А то советнику нечем закрываться кроме тейк профита отдельно на каждый ордер. И ещё бы сделать закрытие обшим тейк профитом.


Делайте заказ доработаю.
avatar

AM2

  • 13 июля 2017, 17:32
0
Эти вещи тогда противоречить будут друг другу:

можно что бы по одной сделки на сигнал тобишь если пересекает цена ма 200 с верху вниз то на этот сигнал одна сделка следущий ждем другово пересечение или на продажу или на покупку


Дожидаемся нового пересечения ценой 10 ема сверху вниз
Дожидаемся нового пересечения ценой 10 ема снизу вверх
avatar

AM2

  • 12 июля 2017, 21:33
0
Добавил МА 10 и пункты: www.opentraders.ru/downloads/1632/

Дожидаемся нового пересечения ценой 10 ема сверху вниз
Дожидаемся нового пересечения ценой 10 ема снизу вверх


avatar

AM2

  • 12 июля 2017, 17:51
+1
Есть все кроме автолота. Смотрите внимательно.
avatar

AM2

  • 12 июля 2017, 17:22
0
Сделал набросок. Смотрите что убавить что прибавить:




//+------------------------------------------------------------------+
//|                                                      Dynamic.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 KLot         = 2;        // умножение лота
extern double MaxLot       = 5;        // максимальный лот
extern double StopLoss     = 500;      // лось
extern double TakeProfit   = 500;      // язь

extern int StartHour       = 0;        // час начала торговли
extern int StartMin        = 30;       // минута начала торговли
extern int EndHour         = 23;       // час окончания торговли
extern int EndMin          = 30;       // минута окончания торговли

extern int Shift           = 1;        // на каком баре сигнал индикатора
extern int Slip            = 30;       // реквот
extern int Trade           = 1;        // 2-открытие нескольких поз
extern int Level           = 32;       // уровень индикатора
extern int Magic           = 123;      // магик

extern string IndName="TDI Red Green";
extern string s="------------- Настройки TDI Red Green -------------";
extern int RSI_Period = 13;         //8-25
extern int RSI_Price = 0;           //0-6
extern int Volatility_Band = 34;    //20-40
extern int RSI_Price_Line=2;
extern int RSI_Price_Type=0;      //0-3
extern int Trade_Signal_Line=7;
extern int Trade_Signal_Type=0;   //0-3

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   double green1=iCustom(NULL,0,IndName,RSI_Period,RSI_Price,Volatility_Band,RSI_Price_Line,RSI_Price_Type,Trade_Signal_Line,Trade_Signal_Type,4,Shift);
   double red1=iCustom(NULL,0,IndName,RSI_Period,RSI_Price,Volatility_Band,RSI_Price_Line,RSI_Price_Type,Trade_Signal_Line,Trade_Signal_Type,5,Shift);
   double green2=iCustom(NULL,0,IndName,RSI_Period,RSI_Price,Volatility_Band,RSI_Price_Line,RSI_Price_Type,Trade_Signal_Line,Trade_Signal_Type,4,Shift+1);
   double red2=iCustom(NULL,0,IndName,RSI_Period,RSI_Price,Volatility_Band,RSI_Price_Line,RSI_Price_Type,Trade_Signal_Line,Trade_Signal_Type,5,Shift+1);
   double ma=iMA(NULL,0,200,0,1,0,Shift);
   
//--- sell 
   if(red1>Level && green1<red1 && green2>red2 && Bid<ma)
     {
      PutOrder(1,Bid);
     }
//--- buy conditions
   if(red1<100-Level && green1>red1 && green2<red2 && Bid>ma)
     {
      PutOrder(0,Ask);
     }
//---
  }
//+------------------------------------------------------------------+
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 Lot()
  {
   double lot=Lots;

   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderProfit()<0)
              {
               lot=OrderLots()*KLot;
              }
            break;
           }
        }
     }
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
  {
   datetime db, de;           // Время начала и окончания работы
   int      hc;               // Часы текущего времени торгового сервера

   db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
   hc=TimeHour(TimeCurrent());

   if(db>=de)
     {
      if(hc>=he) de+=24*60*60; else db-=24*60*60;
     }

   if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
   else return(False);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   double green=iCustom(NULL,0,IndName,4,Shift);
   double red=iCustom(NULL,0,IndName,5,Shift);

   if(t!=Time[0] && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      if(Trade>1) OpenPos();
      if(CountTrades()<1 && Trade==1) OpenPos();
      t=Time[0];
     }

   Comment("\n Red: ",red,
           "\n Green: ",green);
//---
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 11 июля 2017, 17:44
0
Еще раз проверил, открывает. Проверьте кнопку автоторговля и улыбку в углу графика, соединение с интернетом и др. На скрине видно что у вас стоит предыдущая версия. Т.к. скрин маленький больше по нему ничего не скажешь, недостаточно информации чтобы найти причину.



avatar

AM2

  • 11 июля 2017, 17:41
+1
Добавил трюки с перетаскиванием и установкой стопа кликом по графику:


//+------------------------------------------------------------------+
//|                                                    StopLines.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 Koef       = 2;        // коэффициент для тейка
extern int StopLoss      = 300;      // лось
extern int TakeProfit    = 600;      // язь
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

extern string NameLine="SL";
//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   if(WindowPriceOnDropped()<Ask)
     {
      PutOrder(0,Ask);
      if(StopLoss>0)   PutHLine("SL",Bid-StopLoss*Point,Red);
      if(TakeProfit>0) PutHLine("TP",Bid+TakeProfit*Point,Blue);
     }

   if(WindowPriceOnDropped()>Bid)
     {
      PutOrder(1,Bid);
      if(StopLoss>0)   PutHLine("SL",Bid+StopLoss*Point,Red);
      if(TakeProfit>0) PutHLine("TP",Bid-TakeProfit*Point,Blue);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLevel(string name)
  {
   double lev=0;
   for(int i=0;i<ObjectsTotal();i++)
     {
      if(ObjectName(i)==name) lev=ObjectGetDouble(0,name,OBJPROP_PRICE);
     }
   return(lev);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutHLine(string name,double price,color clr)
  {
   ObjectDelete(0,name);
   ObjectCreate(0,name,OBJ_HLINE,0,0,price);
//--- установим цвет линии
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
   ObjectSetInteger(0,name,OBJPROP_STYLE,0);
//--- установим толщину линии
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode()
  {
   bool m;
   double sl=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            sl=MathAbs(OrderOpenPrice()-NormalizeDouble(FindLevel("SL"),Digits));

            if(OrderType()==OP_BUY)
              {
               if(OrderStopLoss()!=NormalizeDouble(FindLevel("SL"),Digits))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(FindLevel("SL"),Digits),NormalizeDouble(OrderOpenPrice()+sl*Koef,Digits),0,Yellow);
                  PutHLine("TP",NormalizeDouble(OrderOpenPrice()+sl*Koef,Digits),Blue);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderStopLoss()!=NormalizeDouble(FindLevel("SL"),Digits))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(FindLevel("SL"),Digits),NormalizeDouble(OrderOpenPrice()-sl*Koef,Digits),0,Yellow);
                  PutHLine("TP",NormalizeDouble(OrderOpenPrice()-sl*Koef,Digits),Blue);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Mode();
   if(CountTrades()<1) OpenPos();

   Comment("\n SL: ",FindLevel("SL"),
           "\n TP: ",FindLevel("TP"));
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- если это события клика мышки на графике
   if(id==CHARTEVENT_CLICK)
     {
      //--- подготовим переменные
      int      x     =(int)lparam;
      int      y     =(int)dparam;
      datetime dt    =0;
      double   price =0;
      int      window=0;
      //--- преобразуем координаты X и Y  в терминах дата/время
      if(ChartXYToTimePrice(0,x,y,window,dt,price))
        {
         if(StopLoss==0) PutHLine("SL",price,Red);
         ChartRedraw(0);
        }
     }
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 11 июля 2017, 06:28
0
Вчера когда было много свободного времени я может быть еще и взялся за такой советник, а сейчас когда работа и речи быть не может. Поэтому юзайте упрощенный вариант.
avatar

AM2

  • 10 июля 2017, 21:39
0
Открылся. Скидывайте логи скрины настройки.

avatar

AM2

  • 10 июля 2017, 20:46
0
По умолчанию в настройках стоит 0, т.е. не открывает поз, 1-бай, 2-селл
avatar

AM2

  • 10 июля 2017, 18:30
+1
Сделал вариант. Тянем за линию стопа и вместе с ней меняется и тейк пропорционально коэффициенту в настройках: www.opentraders.ru/downloads/1631/

extern double Koef = 2;  // коэффициент для тейка


avatar

AM2

  • 9 июля 2017, 13:56
0
А у меня почему прибавляет?


extern double Lots         = 0.1;      // лот
extern double PLot         = 0.1;      // прибавление лота
extern double KLot         = 1;        // умножение лота
extern double MaxLot       = 5;        // максимальный лот


avatar

AM2

  • 9 июля 2017, 13:00
0
Возможно здесь проверялась идея что когда один из ордеров закроется по стопу цена еще какое то время пойдет куда надо?



Но так будет не всегда:




//+------------------------------------------------------------------+
//|                                                    IgrunLock.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       = 1;        // лот
extern int StopLoss      = 120;      // лось
extern int TakeProfit    = 180;      // язь
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

//+------------------------------------------------------------------+
//| 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 AllProfit(int ot=-1)
  {
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1)
     {
      PutOrder(0,Ask);
      PutOrder(1,Bid);
     }
   //if(CountTrades()<2) CloseAll();

   Comment("\n AllProfit: ",AllProfit(),
           "\n Buy Profit: ",AllProfit(0),
           "\n Sell Profit: ",AllProfit(1));
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 9 июля 2017, 12:31
0
Последняя попытка. Далее к платному, больше никаких доработок. Делаю только то что можно быстро сделать.


//+------------------------------------------------------------------+
//|                                                      Zigmund.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       = 300;      // лось
extern int TakeProfit     = 600;      // язь
extern int Delta          = 50;       // расстояние до экстремума
extern int Gamma          = 50;       // длина луча
extern int Slip           = 30;       // реквот
extern int Magic          = 123;      // магик

double z=0;
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;
   double zz0 = ZZPrice(0);
   double zz1 = ZZPrice(1);
   double zz2 = ZZPrice(2);

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

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

   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);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
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());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double ZZPrice(int ne=0)
  {
   double zz;
   int    i,k=iBars(NULL,0),ke=0;

   for(i=1; i<k; i++)
     {
      zz=iCustom(NULL,0,"ZigZag",12,5,3,0,i);
      if(zz!=0)
        {
         ke++;
         if(ke>ne) return(zz);
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double max=0,min=0;
   double zz0 = ZZPrice(0);
   double zz1 = ZZPrice(1);
   double zz2 = ZZPrice(2);
   double gamma = MathAbs(zz0-zz1)/Point;
   double delta = MathAbs(zz0-zz2)/Point;

   if(zz1>zz2) {max=zz1;min=zz2;}
   if(zz1<zz2) {max=zz2;min=zz1;}

   if(t!=Time[0])
     {
      if(z!=zz1) DelOrder();

      if(CountTrades()<1)
        {
         if((zz0>zz1 && zz0<zz2) || (zz0<zz1 && zz0>zz2))
           {
            if(gamma>Gamma && delta>Delta)
              {
               if(CountOrders(4)<1) PutOrder(4,max);
               if(CountOrders(5)<1) PutOrder(5,min);
              }
           }
        }
      z=zz1;
      t=Time[0];
     }

   Comment("\n zz0: ",ZZPrice(0),
           "\n zz1: ",ZZPrice(1),
           "\n zz2: ",ZZPrice(2));
  }
//+------------------------------------------------------------------+



avatar

AM2

  • 9 июля 2017, 12:29
0
Еще одна попытка понять ваше ТЗ:




//+------------------------------------------------------------------+
//|                                                      Zigmund.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       = 300;      // лось
extern int TakeProfit     = 600;      // язь
extern int Delta          = 50;       // расстояние до экстремума
extern int Gamma          = 50;       // длина луча
extern int Slip           = 30;       // реквот
extern int Magic          = 123;      // магик

double z=0;
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;
   double zz0 = ZZPrice(0);
   double zz1 = ZZPrice(1);
   double zz2 = ZZPrice(2);

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

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

   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);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type=-1)
  {
   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 || (OrderType()>=0 && type==-1)) 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());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double ZZPrice(int ne=0)
  {
   double zz;
   int    i,k=iBars(NULL,0),ke=0;

   for(i=1; i<k; i++)
     {
      zz=iCustom(NULL,0,"ZigZag",12,5,3,0,i);
      if(zz!=0)
        {
         ke++;
         if(ke>ne) return(zz);
        }
     }
   Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double max=0,min=0;
   double zz0 = ZZPrice(0);
   double zz1 = ZZPrice(1);
   double zz2 = ZZPrice(2);
   double gamma = MathAbs(zz0-zz1)/Point;
   double delta = MathAbs(zz0-zz2)/Point;

   if(zz1>zz2) {max=zz1;min=zz2;}
   if(zz1<zz2) {max=zz2;min=zz1;}

   if(t!=Time[0])
     {
      if(z!=zz1) DelOrder();

      if(CountTrades()<1)
        {
         if((zz0>zz1 && zz0<zz2) || (zz0<zz1 && zz0>zz2))
           {
            if(gamma>Gamma && delta>Delta)
              {
               if(CountOrders(4)<1) PutOrder(4,max);
               if(CountOrders(5)<1) PutOrder(5,min);
              }
           }
        }
      z=zz1;
      t=Time[0];
     }

   Comment("\n zz0: ",ZZPrice(0),
           "\n zz1: ",ZZPrice(1),
           "\n zz2: ",ZZPrice(2));
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 9 июля 2017, 11:54
0
Покажите на скринах все входы, расстояния, где D, ZL и др. Все максимально подробно.
avatar

AM2

  • 9 июля 2017, 11:08
0
У меня сразу появился <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; 

avatar

AM2

  • 9 июля 2017, 10:56