Мастер MQL5. Один бар - одна сделка. Как сделать? - страница 3

 
Ventras:
И все же - как в коде то (MQL5)? Или в коте? А то тут до кобелей уже дошло...


void OnTick()
{
 static datetime timeNewBar; // эту переменную можно объявить на уровне глобальных переменных

 if(newBar(PERIOD_CURRENT, timeNewBar)) // если функция вернёт true то появился новый бар указанного периода
  {
   Print("Появился новый бар ");
   // и другой код который надо выполнять только при появлении нового бара
  }
}/*******************************************************************/

bool newBar(ENUM_TIMEFRAMES timeframe, datetime &timeOld)
 {
  datetime timeNew = (datetime)SeriesInfoInteger(_Symbol, timeframe, SERIES_LASTBAR_DATE);
   
   if(timeNew > timeOld)
    {
     timeOld = timeNew[0];
     return(true);
    }
   return(false);
 }/*******************************************************************/
 

Вариант, но без "всегда готов"

//+------------------------------------------------------------------+
 if(newBar(PERIOD_CURRENT))
  {
   Print("Появился новый бар ");
   // и другой код который надо выполнять только при появлении нового бара
  }
bool newBar(ENUM_TIMEFRAMES timeframe)
  {
   static bool initial=false;
   static long timeOld=0;
   long timeNew=SeriesInfoInteger(_Symbol,timeframe,SERIES_LASTBAR_DATE);

   if(timeNew-timeOld>=1)
     {
      timeOld=timeNew;
      if(initial)
         return true;
      else
         initial=true;
     }
   return false;
  }
//+------------------------------------------------------------------+
 
Alexey Viktorov:


Lilita Bogachkova:

Вариант, но без "всегда готов"

Так как советник сгенерирован при помощи Мастера MQL5, то вместо текста "// и другой код который надо выполнять только при появлении нового бара" должна быть строка:

ExtExpert.OnTick();
 
Karputov Vladimir:

Так как советник сгенерирован при помощи Мастера MQL5, то вместо текста "// и другой код который надо выполнять только при появлении нового бара" должна быть строка:

Спасибо Владимир, что пояснил разницу. Я никогда не смотрел что за мастер такой (и даже сейчас не стану смотреть) и не знаю тонкостей, просто не буду встревать в дискуссии если речь о мастере mql5.
 
Спасибо всем, кто ответил, попробую варианты.
 
Ventras:
Спасибо всем, кто ответил, попробую варианты.
И что я попробую... Судя по всему, два предложенных выше варианта не подходят для сгенерированных в мастере советников.
 
Ventras:
И что я попробую... Судя по всему, два предложенных выше варианта не подходят для сгенерированных в мастере советников.
А Вы бы прикрепили к посту код сгенерированный Мастером MQL5.
 

Прилагаю код

 
//+------------------------------------------------------------------+
//|                                                         MA#2.mq5 |
//|                                                          Ventras |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Ventras"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalMACD.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingFixedPips.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedRisk.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string             Expert_Title                  ="MA#2";      // Document name
ulong                    Expert_MagicNumber            =13553;       // 
bool                     Expert_EveryTick              =true;       // 
//--- inputs for main signal
input int                Signal_ThresholdOpen          =10;          // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose         =10;          // Signal threshold value to close [0...100]
input double             Signal_PriceLevel             =0.0;         // Price level to execute a deal
input double             Signal_StopLevel              =50.0;        // Stop Loss level (in points)
input double             Signal_TakeLevel              =50.0;        // Take Profit level (in points)
input int                Signal_Expiration             =0;           // Expiration of pending orders (in bars)
input int                Signal_MACD_PeriodFast        =12;          // MACD(12,24,9,PRICE_CLOSE) Period of fast EMA
input int                Signal_MACD_PeriodSlow        =24;          // MACD(12,24,9,PRICE_CLOSE) Period of slow EMA
input int                Signal_MACD_PeriodSignal      =9;           // MACD(12,24,9,PRICE_CLOSE) Period of averaging of difference
input ENUM_APPLIED_PRICE Signal_MACD_Applied           =PRICE_CLOSE; // MACD(12,24,9,PRICE_CLOSE) Prices series
input double             Signal_MACD_Weight            =1.0;         // MACD(12,24,9,PRICE_CLOSE) Weight [0...1.0]
//--- inputs for trailing
input int                Trailing_FixedPips_StopLevel  =30;          // Stop Loss trailing level (in points)
input int                Trailing_FixedPips_ProfitLevel=50;          // Take Profit trailing level (in points)
//--- inputs for money
input double             Money_FixRisk_Percent         =3.0;         // Risk percentage
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initializing expert
if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Creating signal
   CExpertSignal *signal=new CExpertSignal;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(Signal_ThresholdOpen);
   signal.ThresholdClose(Signal_ThresholdClose);
   signal.PriceLevel(Signal_PriceLevel);
   signal.StopLevel(Signal_StopLevel);
   signal.TakeLevel(Signal_TakeLevel);
   signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalMACD
CSignalMACD *filter0=new CSignalMACD;
if(filter0==NULL)
  {
   //--- failed
   printf(__FUNCTION__+": error creating filter0");
   ExtExpert.Deinit();
   return(INIT_FAILED);
  }
signal.AddFilter(filter0);
//--- Set filter parameters
filter0.PeriodFast(Signal_MACD_PeriodFast);
filter0.PeriodSlow(Signal_MACD_PeriodSlow);
filter0.PeriodSignal(Signal_MACD_PeriodSignal);
filter0.Applied(Signal_MACD_Applied);
filter0.Weight(Signal_MACD_Weight);
//--- Creation of trailing object
  CTrailingFixedPips *trailing=new CTrailingFixedPips;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set trailing parameters
trailing.StopLevel(Trailing_FixedPips_StopLevel);
trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
//--- Creation of money object
CMoneyFixedRisk *money=new CMoneyFixedRisk;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set money parameters
money.Percent(Money_FixRisk_Percent);
//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings())
     {
      //--- failed
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- ok
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+
 
Ventras:

Так как задание "настроить советник так, чтобы он совершал только одну сделку на бар", то просто определить новый бар недостаточно. Нужно ещё и знать/определять была ли успешная сделка (записанная в торговую историю) на текущем баре.

Здесь поможет OnTradeTransaction(). Что изучить:

OnTradeTransaction() - поиск по статьям. OnTradeTransaction() - справка по MQL5.

TRADE_TRANSACTION_DEAL_ADD - Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета. 

Советник для асинхронной торговли, который хорошо протоколирует все события в OnTradeTransaction() (взят из справки OrderSendAsync).