Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1117

 
MrBrooklin :

Herkese iyi günler!

İşte Metatrader5 için komut dosyasının bir parçası:


Sorular ortaya çıktı:

1. Planlandığı gibi, komut dosyası, talep ve tekliften belirli bir mesafede bekleyen limit emirleri veya durdurma emirleri vermelidir. Limit bekleyen emirler sorunsuz bir şekilde belirlenir, ancak durdurma emirleri değildir. Lütfen Buy Stop ve Sell Stop bekleyen emirlerinin neden ayarlanmadığını anlamama yardım edin.

2. Piyasa kapalıyken (örneğin hafta sonları) senaryoyu test etmenin bir yolu var mı?

Saygılarımla, Vladimir.

Yardım: Genel İlkeler - Alım Satım İşlemleri

Bekleyen sipariş türleri

Piyasanın mevcut durumu

- şu anda piyasanın durumu

Tahmin etmek

- tahmin etmek

Mevcut fiyat

- Mevcut fiyat

sipariş fiyatı

- sipariş fiyatı

Bekleyen bir siparişin verileceği fiyat

- bekleyen bir emrin verileceği fiyat

Beklenen büyüme

- beklenen büyüme

beklenen düşüş

- beklenen düşüş


Ve başlangıç fiyatının oluşumundaki hatanız:

 //--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

Başlangıç fiyatını Stop ve Limit bekleyen emirler için ayrı ayrı yapmanızı öneririm.

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5

Vladimir Karputov , 2019.08.31 08:16


Ve başlangıç fiyatının oluşumundaki hatanız:

 //--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

Başlangıç fiyatını Stop ve Limit bekleyen emirler için ayrı ayrı yapmanızı öneririm.

Bahşiş için teşekkürler Vladimir.

Senaryoyu kapalı bir pazarda (örneğin, hafta sonları) test etme olasılığı konusunda ne diyorsunuz?

Saygılarımla, Vladimir.

 

Senaryoyu kapalı bir pazarda (örneğin, hafta sonları) test etme olasılığı konusunda ne diyorsunuz?



Soru kaldırıldı çünkü. Cevap başka bir başlıkta verilmiş görünüyor.

Saygılarımla, Vladimir.

 
MrBrooklin :

Soru kaldırıldı çünkü. Cevap başka bir başlıkta verilmiş görünüyor.

Saygılarımla, Vladimir.

Eh, forum boyunca bir soru yetiştirdiniz, dağıttınız ... Kendiniz kafanız karıştı.

 
MrBrooklin :

Bahşiş için teşekkürler Vladimir.

Senaryoyu kapalı bir pazarda (örneğin, hafta sonları) test etme olasılığı konusunda ne diyorsunuz?

Saygılarımla, Vladimir.

Alım satım scriptini hafta sonu çalıştıramazsınız ancak scriptten Expert Advisor yaparsanız test edebilirsiniz.

OnStart yerine OnTick'i koyun ve ticaret işlevlerini OnInit'e taşıyın. Tam olarak güzel değil, ancak hafta sonları senaryoyu test etmek için kullanılabilir.
 
MrBrooklin :

Bahşiş için teşekkürler Vladimir.

Senaryoyu kapalı bir pazarda (örneğin, hafta sonları) test etme olasılığı konusunda ne diyorsunuz?

Saygılarımla, Vladimir.

Bir uzman şöyle görünecek:

 //+------------------------------------------------------------------+
//|                                               Stop and Limit.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;                       // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Enum Stop or Limit                                               |
//+------------------------------------------------------------------+
enum ENUM_STOP_OR_LIMIT
  {
   stop= 0 ,     // Buy stop and Sell stop
   limit= 1      // Buy limit and Sell limit
  };
//--- input parameters
input ushort                InpUpGap          = 15 ;     // Gap for pending orders UP from the current price (in points)
input ushort                InpUpStep         = 30 ;     // Step between orders UP (in points)
input ushort                InpDownGap        = 15 ;     // Gap for pending orders DOWN from the current price (in points)
input ushort                InpDownStep       = 30 ;     // Step between orders DOWN (in points)
input ENUM_STOP_OR_LIMIT   InpPending        = stop;   // Type of pending orders
input uchar                 InpUpQuantity     = 1 ;     // UP quantity orders
input uchar                 InpDownQuantity   = 1 ;     // DOWN quantity orders
input double                InpLots           = 0.01 ;   // Lots
input ushort                InpStopLoss       = 50 ;     // Stop Loss (in points)
input ushort                InpTakeProfit     = 50 ;     // Take Profit (in points)
//---
ulong        m_slippage     = 30 ;     // slippage

double       ExtUpGap       = 0.0 ;
double       ExtUpStep      = 0.0 ;
double       ExtDownGap     = 0.0 ;
double       ExtDownStep    = 0.0 ;
double       ExtStopLoss    = 0.0 ;
double       ExtTakeProfit  = 0.0 ;
double       m_adjusted_point;       // point value adjusted for 3 or 5 points
bool         m_first_start  = false ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   if (!m_symbol.Name( Symbol ())) // sets symbol name
     {
       Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: CSymbolInfo.Name" );
       return ( INIT_FAILED );
     }
   RefreshRates();
//--- tuning for 3 or 5 digits
   int digits_adjust= 1 ;
   if (m_symbol. Digits ()== 3 || m_symbol. Digits ()== 5 )
      digits_adjust= 10 ;
   m_adjusted_point=m_symbol. Point ()*digits_adjust;

   ExtUpGap       =  InpUpGap       * m_adjusted_point;
   ExtUpStep      =  InpUpStep      * m_adjusted_point;
   ExtDownGap     =  InpDownGap     * m_adjusted_point;
   ExtDownStep    =  InpDownStep    * m_adjusted_point;
   ExtStopLoss    =  InpStopLoss    * m_adjusted_point;
   ExtTakeProfit  =  InpTakeProfit  * m_adjusted_point;
//--- check the input parameter "Lots"
   string err_text= "" ;
   if (!CheckVolumeValue(InpLots,err_text))
     {
       //--- when testing, we will only output to the log about incorrect input parameters
       if ( MQLInfoInteger ( MQL_TESTER ))
        {
         Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " ,err_text);
         return ( INIT_FAILED );
        }
       else // if the Expert Advisor is run on the chart, tell the user about the error
        {
         Alert ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " ,err_text);
         return ( INIT_PARAMETERS_INCORRECT );
        }
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (m_first_start)
       return ;
//---
   if (!RefreshRates())
       return ;
//--- start work
   double start_price_ask= 0.0 ;
   double start_price_bid= 0.0 ;
   if (InpPending==stop)
     {
      start_price_ask=m_symbol.Ask()+ExtUpGap;
      start_price_bid=m_symbol.Bid()-ExtDownGap;
     }
   else
       if (InpPending==limit)
        {
         start_price_ask=m_symbol.Ask()-ExtUpGap;
         start_price_bid=m_symbol.Bid()+ExtDownGap;
        }
//--- set pending orders
   for ( int i= 0 ; i<InpUpQuantity; i++)
     {
       double price_ask = start_price_ask+i*ExtUpStep;
       double price_bid = start_price_bid+i*ExtUpStep;
       if (InpPending==stop)
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyStop(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                         m_symbol.NormalizePrice(sl),
                         m_symbol.NormalizePrice(tp));
        }
       else
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellLimit(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                           m_symbol.NormalizePrice(sl),
                           m_symbol.NormalizePrice(tp));
        }
     }

//--- set pending orders
   for ( int i= 0 ; i<InpDownQuantity; i++)
     {
       double price_ask = start_price_ask-i*ExtDownStep;
       double price_bid = start_price_bid-i*ExtDownStep;
       if (InpPending==limit)
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
       else
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
//---
   m_first_start= true ;
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if (!m_symbol.RefreshRates())
     {
       Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "RefreshRates error" );
       return ( false );
     }
//--- protection against the return value of "zero"
   if (m_symbol.Ask()== 0 || m_symbol.Bid()== 0 )
     {
       Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "Ask == 0.0 OR Bid == 0.0" );
       return ( false );
     }
//---
   return ( true );
  }
//+------------------------------------------------------------------+
//| Check the correctness of the position volume                     |
//+------------------------------------------------------------------+
bool CheckVolumeValue( double volume, string &error_description)
  {
//--- minimal allowed volume for trade operations
   double min_volume=m_symbol.LotsMin();
   if (volume<min_volume)
     {
       if ( TerminalInfoString ( TERMINAL_LANGUAGE )== "Russian" )
         error_description= StringFormat ( "Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f" ,min_volume);
       else
         error_description= StringFormat ( "Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f" ,min_volume);
       return ( false );
     }
//--- maximal allowed volume of trade operations
   double max_volume=m_symbol.LotsMax();
   if (volume>max_volume)
     {
       if ( TerminalInfoString ( TERMINAL_LANGUAGE )== "Russian" )
         error_description= StringFormat ( "Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f" ,max_volume);
       else
         error_description= StringFormat ( "Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f" ,max_volume);
       return ( false );
     }
//--- get minimal step of volume changing
   double volume_step=m_symbol.LotsStep();
   int ratio=( int ) MathRound (volume/volume_step);
   if ( MathAbs (ratio*volume_step-volume)> 0.0000001 )
     {
       if ( TerminalInfoString ( TERMINAL_LANGUAGE )== "Russian" )
         error_description= StringFormat ( "Объем не кратен минимальному шагу SYMBOL_VOLUME_STEP=%.2f, ближайший правильный объем %.2f" ,
                                        volume_step,ratio*volume_step);
       else
         error_description= StringFormat ( "Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f" ,
                                        volume_step,ratio*volume_step);
       return ( false );
     }
   error_description= "Correct volume value" ;
   return ( true );
  }
//+------------------------------------------------------------------+
Dosyalar:
 

Vladimir Karputov , 2019.08.31 13:20

Bir uzman şöyle görünecek:



Sınıf!

Teşekkürler Vladimir, bana yardım ettiler, yoksa pazartesiye kadar acı çekerdim.

Saygılarımla, Vladimir.

 
MrBrooklin :

Sınıf!

Teşekkürler Vladimir, bana yardım ettiler, yoksa pazartesiye kadar acı çekerdim.

Saygılarımla, Vladimir.

Rica ederim.

Global program düzeyinde bildirilen m_first_start değişkenine dikkat edin

 bool         m_first_start  = false ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()

OnTick'in sonunda bu değişken "true" olarak ayarlanır

 //---
   m_first_start= true ;
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {

ve EA artık bir sonraki yeniden başlatmaya kadar bekleyen siparişler vermeyecek

 //+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (m_first_start)
       return ;
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5

Vladimir Karputov , 2019.08.31 14:38

Rica ederim.

Global program düzeyinde bildirilen m_first_start değişkenine dikkat edin

Evet Vladimir, Test sırasında Expert Advisor'ın bir komut dosyası gibi çalıştığını hemen fark ettim. Tekrar teşekkürler!

Saygılarımla, Vladimir.

 

Mum çıkışı neden çalışmıyor?


 #property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots    1

#property indicator_label1    "SecondInstrument"
#property indicator_type1    DRAW_CANDLES
#property indicator_color1    clrBlack , clrGreen , clrRed
#property indicator_style1    STYLE_SOLID 
#property indicator_width1    1 

double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

string symbol = "GBPJPY.m" ;
int barsToBuid = 100 ;
int deviation = 0 ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,OBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,HBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,LBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 3 ,CBuffer, INDICATOR_DATA );

   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 ); 
   PlotIndexSetString ( 0 , PLOT_LABEL ,symbol+ " Open;" +symbol+ " High;" +symbol+ " Low;" +symbol+ " Close" ); 
   IndicatorSetString ( INDICATOR_SHORTNAME , "DRAW_CANDLES(" +symbol+ ")" );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[]){
                
   for ( int i= 0 ;i<barsToBuid;i++){
      OBuffer[i] = iOpen (symbol, PERIOD_CURRENT , i) + deviation* _Point ;
      HBuffer[i] = iHigh (symbol, PERIOD_CURRENT , i) + deviation* _Point ;
      LBuffer[i] = iLow (symbol, PERIOD_CURRENT , i) + deviation* _Point ;
      CBuffer[i] = iClose (symbol, PERIOD_CURRENT , i) + deviation* _Point ;
      
     }
   return (rates_total);
  }
//+------------------------------------------------------------------+
Neden: