Напишу советник бесплатно - страница 155

 
Oltinbek Sohibov #:

Здравствуйте !

кто может  помочь  на этот  советник  добавит СЛ и ТП   и временный интервал торговля   

спасибо  за ранее 

//--- additional checking
   double sl   =500;
   double tp   =500;
   if(signal!=WRONG_VALUE)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         ExtTrade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),
                               SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
                               SymbolInfoDouble(_Symbol,sl==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
                               SymbolInfoDouble(_Symbol,tp==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK));
     }
//---

что то тут надо слепить для СЛ и ТП 

 
Oltinbek Sohibov #:

Здравствуйте !

кто может  помочь  на этот  советник  добавит СЛ и ТП   и временный интервал торговля   

спасибо  за ранее 

вот из примера https://www.mql5.com/ru/docs/constants/structures/mqltraderequest

//+------------------------------------------------------------------+

//|                                                    MA CCI  1.mq5 |

//|                                  Copyright 2021, MetaQuotes Ltd. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2021, MetaQuotes Ltd."

#property link      "https://www.mql5.com"

#property version   "1.00"

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

#include <Trade\Trade.mqh>



input double MaximumRisk        = 0.02;    // Maximum Risk in percentage

input double DecreaseFactor     = 3;       // Descrease factor

input int    MovingPeriod       = 150;      // Moving Average period

input int    MovingShift        = 0;       // Moving Average shift





input int    ma_period          = 14;     // период усреднения

input int    CCI_level_high     = 220;

input int    CCI_level_low      = -220;



extern double Max_spread        = 20; // максимально допустимый спред при входе

extern int    Sl                = 150; // стоплосс - 0-выкл.

extern int    Tp                = 500; // тейкпрофит - 0-выкл.

extern double Lots              = 0.01; // лот







//---

int    ExtHandle=0;

bool   ExtHedging=false;

CTrade ExtTrade;



int    CCIHandle=0;





#define MA_MAGIC 1234501

//+------------------------------------------------------------------+

//| Calculate optimal lot size                                       |

//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
      return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
      return(0.0);
   if(margin<=0.0)
      return(0.0);
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);
//--- calculate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      //--- select history for access
      HistorySelect(0,TimeCurrent());
      //---
      int    orders=HistoryDealsTotal();  // total history deals
      int    losses=0;                    // number of losses orders without a break
      for(int i=orders-1; i>=0; i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            break;
           }
         //--- check symbol
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)
            continue;
         //--- check Expert Magic number
         if(HistoryDealGetInteger(ticket,DEAL_MAGIC)!=MA_MAGIC)
            continue;
         //--- check profit
         double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         if(profit>0.0)
            break;
         if(profit<0.0)
            losses++;
        }
      //---
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);
   double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol)
      lot=minvol;
   double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol)
      lot=maxvol;
//--- return trading volume
   return(lot);
  }
//+------------------------------------------------------------------+

//| Check for open position conditions                               |

//+------------------------------------------------------------------+
void CheckForOpen(void)

  {
   MqlRates rt[2];
//--- go trading only for first ticks of new bar
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1)
      return;
//--- get current Moving Average
   double   ma[1];
   if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- check signals
   ENUM_ORDER_TYPE signal=WRONG_VALUE;
   if(rt[0].open>ma[0] && rt[0].close<ma[0] && ma_period<CCI_level_high)           // && ma_period>CCI_level_high
      signal=ORDER_TYPE_SELL;    // sell conditions
   else
     {
      if(rt[0].open<ma[0] && rt[0].close>ma[0]  &&  ma_period>CCI_level_low)         // &&  ma_period<CCI_level_low
         signal=ORDER_TYPE_BUY;  // buy conditions
     }
//--- additional checking
   if(signal!=WRONG_VALUE)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         ExtTrade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),
                               SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
                               0,0);
     }
//---
  }
//+------------------------------------------------------------------+

//| Check for close position conditions                              |

//+------------------------------------------------------------------+
void CheckForClose(void)

  {
   MqlRates rt[2];
//--- go trading only for first ticks of new bar
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1)
      return;
//--- get current Moving Average
   double   ma[1];
   if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- positions already selected before
   bool signal=false;
   long type=PositionGetInteger(POSITION_TYPE);
   if(type==(long)POSITION_TYPE_BUY && rt[0].open>ma[0] && rt[0].close<ma[0])        //
      signal=true;
   if(type==(long)POSITION_TYPE_SELL && rt[0].open<ma[0] && rt[0].close>ma[0])       //
      signal=true;
//--- additional checking
   if(signal)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         ExtTrade.PositionClose(_Symbol,3);
     }
//---
  }
//+------------------------------------------------------------------+

//| Position select depending on netting or hedging                  |

//+------------------------------------------------------------------+
bool SelectPosition()

  {
   bool res=false;
//--- check position in Hedging mode
   if(ExtHedging)
     {
      uint total=PositionsTotal();
      for(uint i=0; i<total; i++)
        {
         string position_symbol=PositionGetSymbol(i);
         if(_Symbol==position_symbol && MA_MAGIC==PositionGetInteger(POSITION_MAGIC))
           {
            res=true;
            break;
           }
        }
     }
//--- check position in Netting mode
   else
     {
      if(!PositionSelect(_Symbol))
         return(false);
      else
         return(PositionGetInteger(POSITION_MAGIC)==MA_MAGIC); //---check Magic number
     }
//--- result for Hedging mode
   return(res);
  }

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+
int OnInit(void)

  {
//--- prepare trade class to control positions if hedging mode is active
   ExtHedging=((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
   ExtTrade.SetExpertMagicNumber(MA_MAGIC);
   ExtTrade.SetMarginMode();
   ExtTrade.SetTypeFillingBySymbol(Symbol());
//--- Moving Average indicator
   ExtHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE);
   if(ExtHandle==INVALID_HANDLE)
     {
      printf("Error creating MA indicator");
      return(INIT_FAILED);
     }
//--- индикатора Commodity Channel Index
   CCIHandle=iCCI(_Symbol,_Period,ma_period,_AppliedTo);
   if(CCIHandle==INVALID_HANDLE)
     {
      printf("Error creating CCI indicator");
      return(INIT_FAILED);
     }
//--- ok
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+
void OnTick(void)

  {
//---
   if(SelectPosition())
      CheckForClose();
   else
      CheckForOpen();
   OnStartsltp();
//---
  }
//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+
void OnDeinit(const int reason)

  {
  }
//+------------------------------------------------------------------+
//| Модификация Stop Loss и Take Profit позиции                      |
//+------------------------------------------------------------------+
void OnStartsltp()
  {
//--- объявление запроса и результата
   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // количество открытых позиций
//--- перебор всех открытых позиций
   for(int i=0; i<total; i++)
     {
      //--- параметры ордера
      ulong  position_ticket=PositionGetTicket(i);// тикет позиции
      string position_symbol=PositionGetString(POSITION_SYMBOL); // символ
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой
      ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber позиции
      double volume=PositionGetDouble(POSITION_VOLUME);    // объем позиции
      double sl=PositionGetDouble(POSITION_SL);  // Stop Loss позиции
      double tp=PositionGetDouble(POSITION_TP);  // Take Profit позиции
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);  // тип позиции
      //--- вывод информации о позиции
      PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]",
                  position_ticket,
                  position_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  DoubleToString(sl,digits),
                  DoubleToString(tp,digits),
                  magic);
      //--- если MagicNumber совпадает, Stop Loss и Take Profit не заданы
      if(magic==MA_MAGIC && sl==0 && tp==0)
        {
         //--- вычисление текущих ценовых уровней
         double price=PositionGetDouble(POSITION_PRICE_OPEN);
         double bid=SymbolInfoDouble(position_symbol,SYMBOL_BID);
         double ask=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
         int    stop_level=(int)SymbolInfoInteger(position_symbol,SYMBOL_TRADE_STOPS_LEVEL);
         double price_level;
         //--- если уровень минимально допустимого отступа в пунктах от текущей цены закрытия не задан
         if(stop_level<=0)
            stop_level=150; // зададим отступ в 150 пунктов от текущей цены закрытия
         else
            stop_level+=50; // уровень отступа возьмем равным (SYMBOL_TRADE_STOPS_LEVEL + 50) пунктов для надежности
         //--- вычисление и округление значений Stop Loss и Take Profit
         price_level=stop_level*SymbolInfoDouble(position_symbol,SYMBOL_POINT);
         if(type==POSITION_TYPE_BUY)
           {
            sl=NormalizeDouble(bid-price_level,digits);
            tp=NormalizeDouble(bid+price_level,digits);
           }
         else
           {
            sl=NormalizeDouble(ask+price_level,digits);
            tp=NormalizeDouble(ask-price_level,digits);
           }
         //--- обнуление значений запроса и результата
         ZeroMemory(request);
         ZeroMemory(result);
         //--- установка параметров операции
         request.action  =TRADE_ACTION_SLTP; // тип торговой операции
         request.position=position_ticket;   // тикет позиции
         request.symbol=position_symbol;     // символ
         request.sl      =sl;                // Stop Loss позиции
         request.tp      =tp;                // Take Profit позиции
         request.magic=MA_MAGIC;         // MagicNumber позиции
         //--- вывод информации о модификации
         PrintFormat("Modify #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
         //--- отправка запроса
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // если отправить запрос не удалось, вывести код ошибки
         //--- информация об операции
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
        }
     }
  }
//+------------------------------------------------------------------+

Снимок экрана_2021-09-03_20-24-38.png 122.9 kB 1366 x 768px

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Структура торгового запроса - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Anton Yakovlev:
если у вас есть хороая стратегия, и вы готовы ей поделиться,могу написать советника. приглашаю обсудить публично
Сдраствуйте,возможно ли написать индикатор на основе свечьных моделей(паттернов,движений незнаю как еще назвать),с определенными движениями свечей,а далее написать советник на этот индикатор с подследующими поправками?.спасибо
 

Здравствуйте !

спасибо большое  можете еще добавить  время торговля  например с 12 до 20 он торговал   

благодарю   

 

Доброго времени суток!

Прошу написать, либо скинуть (если есть аналог) простейший советник. 

Условие:

В заданное время ставит лимитные ордера в обе стороны. Всё)) 

Хочу погонять в тестере, поэтому прошу добавить параметры для оптимизации:

- время установки лимитников (достаточно только часы, целые числа)
- время удаления всех лимитников (включая тех, что в рынке - принудительное закрытие)
- кол-во устанавливаемых лимитников с двух сторон (то есть, если установить число 3, то с двух сторон будут установлены по 3 лимитника)
- расстояние от цены до первого лимитника
- шаг между лимитниками (остальными, то есть между 1,2,3... ) 
- СЛ и ТП

Буду очень признателен. 

 
Ivan Butko #:

Доброго времени суток!

Прошу написать, либо скинуть (если есть аналог) простейший советник. 

Условие:

В заданное время ставит лимитные ордера в обе стороны. Всё)) 

Хочу погонять в тестере, поэтому прошу добавить параметры для оптимизации:

- время установки лимитников (достаточно только часы, целые числа)
- время удаления всех лимитников (включая тех, что в рынке - принудительное закрытие)
- кол-во устанавливаемых лимитников с двух сторон (то есть, если установить число 3, то с двух сторон будут установлены по 3 лимитника)
- расстояние от цены до первого лимитника
- шаг между лимитниками (остальными, то есть между 1,2,3... ) 
- СЛ и ТП

Буду очень признателен. 

Только по одному ордеру с обоих сторон. И трал потом.

Файлы:
 
Valeriy Yastremskiy #:

Только по одному ордеру с обоих сторон. И трал потом.

Там идея в том, чтобы забирать всё флетовое ночное движение, и поэтому выставляются несколько лимиток. В любом случае, спасибо за аналог программы. 

К сожалению, при тестировании и оптимизации вылетает "2021.09.09 16:39:38.084 2021.01.04 07:00:00  Time_Open_Trail_3_21 EURUSD,H1: Alert: The order opening time is less than the current time. The expert Advisor doesn't work."

Пробовал ставить любое время: и прошедшее и новое, всё равно так пишет. 


 
Ivan Butko #:

Там идея в том, чтобы забирать всё флетовое ночное движение, и поэтому выставляются несколько лимиток. В любом случае, спасибо за аналог программы. 

К сожалению, при тестировании и оптимизации вылетает "2021.09.09 16:39:38.084 2021.01.04 07:00:00  Time_Open_Trail_3_21 EURUSD,H1: Alert: The order opening time is less than the current time. The expert Advisor doesn't work."

Пробовал ставить любое время: и прошедшее и новое, всё равно так пишет. 


Разницу терминального и локального времени учитываете? Пишет, что время позже чем то которое есть ставите. У меня проверку проходит.

В тестере просто выставляются отложенные ордера и все. Это для маркета сделано было.

Зы. У вас в дате ошибка) 1 апреля дата стоит. )

ЗыЗы В тестере не возможно установить дату вперед, в ОнИнит в тестере терминальное время, а не время тестируемое, которое изначально уже прошло.

 
Valeriy Yastremskiy #:

Разницу терминального и локального времени учитываете? Пишет, что время позже чем то которое есть ставите. У меня проверку проходит.

В тестере просто выставляются отложенные ордера и все. Это для маркета сделано было.

Зы. У вас в дате ошибка) 1 апреля дата стоит. )

ЗыЗы В тестере не возможно установить дату вперед, в ОнИнит в тестере терминальное время, а не время тестируемое, которое изначально уже прошло.

Видимо другой формат времени у терминала, я поставил тест с 01 января 2021, а он начинает и пишет 2021.01.04 (с 4 января)))


 
Ivan Butko #:

Видимо другой формат времени у терминала, я поставил тест с 01 января 2021, а он начинает и пишет 2021.01.04 (с 4 января)))


По хорошему, если хотите в тестере смотреть, можно проверку убрать на время позже реального. Это в ОнИнит. И не помню, точно ли в 4ке в тестере запрос времени таймкаррент вернет время тестера. По моему он вернет текущее время, поэтому в тестере там просто выставляются ордера сразу и все. Так же запрос локального времени даст текущее локальное время. 

Это в 5ке в тестере полный эмулятор окружения.