Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1632

 
amsgif80 #:

Вот такой код пытался вставить: 

вверху кода киньте это:
enum ENUM_DIRECTION{
DIRECTION_BUY = 0, // buy only
DIRECTION_SELL = 1, // sell only
DIRECTION_ANY = 2, // buy & sell
};

input ENUM_DIRECTION inp_direction = DIRECTION_ANY; // разрешенное направление торговли


далее найдите где в коде открывается бай, а где селл. Следует искать внутри функции start() или OnTick()
там где бай в условия добавьте:
if(inp_direction!=DIRECTION_SELL)
там где селл в условия добавьте:
if(inp_direction!=DIRECTION_BUY)

А куда вставлял?
 
MakarFX #:
А куда вставлял?
//+------------------------------------------------------------------+
//|                                              Moving Averages.mq5 |
//|                   Copyright 2009-2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+





#property copyright "Copyright 2009-2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

enum ENUM_DIRECTION{
DIRECTION_BUY = 0, // buy only
DIRECTION_SELL = 1, // sell only
DIRECTION_ANY = 2, // buy & sell
};

input ENUM_DIRECTION inp_direction = DIRECTION_ANY; // разрешенное направление торговли

#include <Trade\Trade.mqh>

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor
input int    MovingPeriod       = 12;      // Moving Average period
input int    MovingShift        = 6;       // Moving Average shift



//---
int   ExtHandle=0;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+




int OnInit(void)
  {
//---
   ExtHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE);
   if(ExtHandle==INVALID_HANDLE)
     {
      printf("Error creating MA indicator");
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
  
  //+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(void)
  {
//---
   if(PositionSelect(_Symbol))
      CheckForClose();
   else
      CheckForOpen();
//---
  }
  
  
  //+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
   double price=0.0;
   double margin=0.0;
//--- рассчитываем размер лота
   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_FREEMARGIN)*MaximumRisk/margin,2);
//--- рассчитываем длину серии непрерывных убыточных сделок
   if(DecreaseFactor>0)
     {
      //--- запрашиваем всю торговую историю
      HistorySelect(0,TimeCurrent());
      //--
      int    orders=HistoryDealsTotal();  // общее количество сделок
      int    losses=0;                    // количество убыточных сделок в серии

      for(int i=orders-1;i>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            break;
           }
         //--- проверка символа сделки
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)
            continue;
         //--- проверка прибыли
         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);
     }
//--- нормализация и проверка допустимых значений торгового объема
   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(lot);
  }


//+------------------------------------------------------------------+
//| Check for open position conditions                               |
//+------------------------------------------------------------------+
void CheckForOpen(void)
  {
   MqlRates rt[2];
//--- копируем значения цен
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
//--- торгуем только на первом тике нового бара
   if(rt[1].tick_volume>1)
      return;
//--- получаем текущее значение индикатора Moving Average 
   double   ma[1];
   if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- проверка сигналов
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(rt[0].open>ma[0] && rt[0].close<ma[0])
      signal=ORDER_TYPE_SELL;    // условие на продажу  if(inp_direction!=DIRECTION_BUY)
   else
     {
      if(rt[0].open<ma[0] && rt[0].close>ma[0])
         signal=ORDER_TYPE_BUY;  // условие на покупку if(inp_direction!=DIRECTION_SELL)
     }
//--- дополнительные проверки
   if(signal!=WRONG_VALUE)
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         if(Bars(_Symbol,_Period)>100)
           {
            CTrade trade;
            trade.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];
//--- копируем значения цен
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
//--- торгуем только на первом тике нового бара
   if(rt[1].tick_volume>1)
      return;
//--- получаем текущее значение индикатора Moving Average 
   double   ma[1];
   if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- получаем тип позиции, выбранной ранее через PositionSelect()
   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;
//--- дополнительные проверки
   if(signal)
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         if(Bars(_Symbol,_Period)>100)
           {
            CTrade trade;
            trade.PositionClose(_Symbol,3);
           }
//---
  }
  
  
  
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 

Вот этот участок должен быть таким

 //--- проверка сигналов
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(rt[0].open>ma[0] && rt[0].close<ma[0])
     {
      if(inp_direction!=DIRECTION_BUY)
         signal=ORDER_TYPE_SELL;
     }
   else
     {
      if(rt[0].open<ma[0] && rt[0].close>ma[0])
        {
         if(inp_direction!=DIRECTION_SELL)
            signal=ORDER_TYPE_BUY;
        }
     }
 //--- дополнительные проверки 
 
MakarFX #:

Вот этот участок должен быть таким

Макар, вот это

      if(inp_direction==DIRECTION_SELL||inp_direction==DIRECTION_ANY)

лучше заменить этим

      if(inp_direction!=DIRECTION_BUY)
 
Alexey Viktorov #:

Макар, вот это

лучше заменить этим

Заменил)
 
MakarFX #:

Вот этот участок должен быть таким

Благодарю от души! Сразу все получилось, заработало. А я голову сломал уже, как это сделать))

 
А можно я еще раз обращусь к Вам с тем же вопросом, только уже по собственному, простенькому советнику, который сгенерировал в редакторе? Думал, что теперь уже сам справлюсь на прошлом примере, но не тут то было. Не могу понять куда этот код Buy/Sell) вставить.
 
amsgif80 #:
А можно я еще раз обращусь к Вам с тем же вопросом, только уже по собственному, простенькому советнику, который сгенерировал в редакторе? Думал, что теперь уже сам справлюсь на прошлом примере, но не тут то было. Не могу понять куда этот код Buy/Sell) вставить.
Показывай
 
amsgif80 #:

Я же показал как вставлять код на форуме


 
MakarFX #:

Ты ничего не изменил

твое обращение

находится внутри

Макар спасибо за подсказку 

Причина обращения: