0
ПОКУПКИ:

Когда происходит H1, EMA 14> SMA20 && MACD (Main)> MACD (signal) && Затем на M30 происходит нечто подобное EMA 14> SMA20 && MACD (Main)> MACD (signal), затем на M15: EMA 14> SMA20 && MACD (основной)> MACD (сигнал) && MACD (основной)> 0 && MACD (сигнал)> 0

Условия продажи противоположны условиям ПОКУПКИ.

я перенес часть условий в советник, но их у вас во всех индикаторах слишком много.


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

//--- Inputs
extern double Lots       = 0.01;     // торговый объем ордера
extern double MaxLot     = 5;        // максимальный торговый объем
extern double KLot       = 1;        // увеличение лота

extern int StopLoss      = 0;        // лось
extern int TakeProfit    = 0;        // язь

extern int MA1Period     = 14;       // период МА1
extern int MA2Period     = 20;       // период МА2

extern int Fast          = 12;       // Fast EMA period
extern int Slow          = 26;       // Slow EMA period
extern int Signal        = 9;        // Signal SMA period

extern int CloseSig      = 1;        // 1-закрытие по сигналу 0-нет
extern int Shift         = 1;        // бар индикатора
extern int Slip          = 30;       // реквот
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)
  {
   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;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   if(CountTrades()>0)
      lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double H1MA1=iMA(NULL,60,MA1Period,0,1,0,Shift);
   double H1MA2=iMA(NULL,60,MA2Period,0,0,0,Shift);
   double H1Main=iMACD(NULL,60,Fast,Slow,Signal,0,MODE_MAIN,Shift);
   double H1Sign=iMACD(NULL,60,Fast,Slow,Slow,0,MODE_SIGNAL,Shift);

   double M30MA1=iMA(NULL,30,MA1Period,0,1,0,Shift);
   double M30MA2=iMA(NULL,30,MA2Period,0,0,0,Shift);
   double M30Main=iMACD(NULL,30,Fast,Slow,Slow,0,MODE_MAIN,Shift);
   double M30Sign=iMACD(NULL,30,Fast,Slow,Slow,0,MODE_SIGNAL,Shift);

   double M15MA1=iMA(NULL,15,MA1Period,0,1,0,Shift);
   double M15MA2=iMA(NULL,15,MA2Period,0,0,0,Shift);
   double M15Main=iMACD(NULL,15,Fast,Slow,Slow,0,MODE_MAIN,Shift);
   double M15Sign=iMACD(NULL,15,Fast,Slow,Slow,0,MODE_SIGNAL,Shift);

   bool buy=H1MA1>H1MA2 && H1Main>H1Sign && M30MA1>M30MA2 && M30Main>M30Sign && M15MA1>M15MA2 && M15Main>M15Sign && M15Sign>0;
   bool sell=H1MA1<H1MA2 && H1Main<H1Sign && M30MA1<M30MA2 && M30Main<M30Sign && M15MA1<M15MA2 && M15Main<M15Sign && M15Sign<0;

   if(CountTrades()<1)
     {
      if(buy)
         PutOrder(0,Ask);
      if(sell)
         PutOrder(1,Bid);
     }
   if(CloseSig>0)
     {
      if(sell)
         CloseAll(0);
      if(buy)
         CloseAll(1);
     }

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

avatar

AM2

  • 23 ноября 2020, 13:32
0
такого опыта нет, но сейчас посмотрю статейки
avatar

AM2

  • 23 ноября 2020, 12:56
0
у индикаторов как я понимаю нет буферов, а считывать значения с объектов очень непросто.

если известен алгоритм определения тренда в индикаторе, то можно прописать сразу в советнике.
avatar

AM2

  • 22 ноября 2020, 09:53
0
У Вас ситуация чуть другая, нет в моменте отложенных ордеров и на Селл и на Бай.


есть и те и другие. я специально в коде сделал так, чтобы выставлялись обе серии а потом одна удалялась
avatar

AM2

  • 22 ноября 2020, 09:46
0
Не помогло, удаляет все отложенные ордера, как и универсальный код по удалению.


написал пример. все работает:




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

//--- Inputs
extern double  Lots        = 0.1;      // объем первого ордера
extern int     StopLoss    = 0;        // стоплосс
extern int     TakeProfit  = 100;      // тейкпрофит
extern int     Step        = 100;      // шаг ордеров
extern int     Count       = 5;        // количество ордеров
extern int     Slip        = 3;        // проскальзывание
extern int     Magic       = 123;      // магик
//+------------------------------------------------------------------+
//| 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,Lots,NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int type=-1)
  {
   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 || type==-1)
               del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double ma=iMA(NULL,0,20,0,0,0,1);

   if(Close[1]>ma && CountOrders(4)<1)
     {
      for(int i=1; i<=Count; i++)
         PutOrder(4,Bid+Step*_Point*i);
      DelOrder(5);
     }
   if(Close[1]<ma && CountOrders(5)<1)
     {
      for(int i=1; i<=Count; i++)
         PutOrder(5,Bid-Step*_Point*i);
      DelOrder(4);
     }
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 21 ноября 2020, 22:22
0
интересный параметр. если хедж долго болтается без профита, его надо закрывать:



www.opentraders.ru/downloads/2743/
avatar

AM2

  • 20 ноября 2020, 21:42
0

//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int type=-1)
  {
   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 || type==-1)
               del=OrderDelete(OrderTicket());
           }
        }
     }
  }
avatar

AM2

  • 20 ноября 2020, 17:58
0
с чужим кодом не ко мне
avatar

AM2

  • 20 ноября 2020, 17:56
+1
столько времени и сил потрачено а советник как всегда сливной *spokuha* 



www.opentraders.ru/downloads/2858/
avatar

AM2

  • 19 ноября 2020, 22:32
0
сделал по другому:


//+------------------------------------------------------------------+
//|                                                     ProBoy20.mq4 |
//|                                              Copyright 2020, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, 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 Profit     = 20;       // язь в рублях
extern int Delta         = 100;      // шаг
extern int Slip          = 0;        // реквот
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;

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

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

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,0,0,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(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()<2 && OrderType()==type) || (OrderType()<2 && type==-1))
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;

   if(CountTrades()>0)
     {
      lot=NormalizeDouble(Lots*CountTrades(),2);
     }
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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()>1) || (OrderType()>1  && type==-1))
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del=1;
   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 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);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountOrders()==1)
     {
      DelOrder();
     }

   if(CountTrades(1)>0)
     {
      CloseAll(0);
     }
     
   if(CountTrades(0)>0)
     {
      CloseAll(1);
     }

   if(CountOrders()<1)
     {
      PutOrder(4,Bid+Delta*_Point);
      PutOrder(5,Bid-Delta*_Point);
     }

   if(AllProfit()>Profit && Profit>0)
      CloseAll();

   Comment("\n Trades: ",CountTrades(),
           "\n Orders: ",CountOrders());
  }
//+------------------------------------------------------------------+



но вот этот момент пока не представляю как объяснить машине:

При срабатывании BUYSTOP, все SELL закрываются. И наоборот


как объяснить машине что сработал бай стоп или селл стоп?

у меня пока стоит появление бая или села. но с этим чехарда.
avatar

AM2

  • 19 ноября 2020, 21:45
0
1 и 2 уже есть в советнике. а п.3 нужно подробнее
avatar

AM2

  • 19 ноября 2020, 20:48
0
в выходные могу глянуть еще, только вопросы еще есть по заданию
avatar

AM2

  • 19 ноября 2020, 17:42
0
сложная реализация при кажущейся простоте задания. пока набросок:


//+------------------------------------------------------------------+
//|                                                     ProBoy20.mq4 |
//|                                              Copyright 2020, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, 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 int Count         = 100;      // баров для посчета
extern int Slip          = 0;        // реквот
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;

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

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

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,0,0,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(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()<2 && OrderType()==type) || type==-1)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;

   if(CountTrades()>0)
     {
      lot=NormalizeDouble(Lots*CountTrades(),2);
     }
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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 || (type==-1 && OrderType()>1))
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del=1;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1)
               del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountOrders()==1)
     {
      DelOrder();
     }

   if(CountTrades(0)>0)
     {
      CloseAll(1);
     }
   if(CountTrades(1)>0)
     {
      CloseAll(0);
     }

   if(t!=Time[0])
     {
      PutOrder(4,High[1]);
      PutOrder(5,Low[1]);
      t=Time[0];
     }

   Comment("\n Trades: ",CountTrades(),
           "\n Orders: ",CountOrders());
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 18 ноября 2020, 22:18
0
на 20-е
avatar

AM2

  • 18 ноября 2020, 20:43
0
опять та же петрушка. текстом написали а подробных скринов нет к заданию
avatar

AM2

  • 17 ноября 2020, 22:21
0
давайте по шагам. здесь открылась поза на графике, здесь не так и т.д. на графике покажите
avatar

AM2

  • 17 ноября 2020, 22:16