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

 

İyi günler, OrderCalcProfit sistem fonksiyonunun garip bir davranışını gözlemliyorum, öyle görünüyor ki hesaplama sırasında hacim parametresi yok sayılıyor, yani kar büyüklüğü her zaman 1.0'lık bir hacim için hesaplanıyor.

Farklı demo hesaplarında farklı döviz çiftleri için test cihazını kontrol ediyorum.

1. Hesaplama doğru bir şekilde gerçekleştirilir, 1.0 için bkz. calc_profi101.png

2. İkinci ve sonraki herhangi birişlev çağrısı , 1.0 hacmine dayalı olarak kâr sonucunu döndürür, hacim değeri yoksayılır, bkz. printscreen (calc_profit02.png) - hacim 0,5 iletilir, ancak sonuç 1.0 ile aynıdır

Bana sorunun ne olabileceğini söyle. teşekkürler

Dosyalar:
 
aveshoff :

İyi günler, OrderCalcProfit sistem fonksiyonunun garip bir davranışını gözlemliyorum, öyle görünüyor ki hesaplama sırasında hacim parametresi yok sayılıyor, yani kar büyüklüğü her zaman 1.0'lık bir hacim için hesaplanıyor.

Farklı demo hesaplarında farklı döviz çiftleri için test cihazını kontrol ediyorum.

1. Hesaplama doğru bir şekilde gerçekleştirilir, 1.0 için bkz. calc_profi101.png

2. İkinci ve sonraki herhangi birişlev çağrısı , 1.0 hacmine dayalı olarak kâr sonucunu döndürür, hacim değeri yoksayılır, bkz. printscreen (calc_profit02.png) - hacim 0,5 iletilir, ancak sonuç 1.0 ile aynıdır

Bana sorunun ne olabileceğini söyle. teşekkürler

Bence cevap yardımda:

"... kar

[out] Fonksiyonun başarılı bir şekilde yürütülmesi durumunda hesaplanan kar değerinin yazılacağı değişken. Kâr tahmininin değeri birçok faktöre bağlıdır ve piyasa ortamı değiştikçe değişebilir . ... "


Eklendi: Bu sadece bir tahmin olmasına rağmen.

 
aveshoff :

İyi günler, OrderCalcProfit sistem fonksiyonunun garip bir davranışını gözlemliyorum, öyle görünüyor ki hesaplama sırasında hacim parametresi yok sayılıyor, yani kar büyüklüğü her zaman 1.0'lık bir hacim için hesaplanıyor.

Farklı demo hesaplarında farklı döviz çiftleri için test cihazını kontrol ediyorum.

1. Hesaplama doğru bir şekilde gerçekleştirilir, 1.0 için bkz. calc_profi101.png

2. İkinci ve sonraki herhangi birişlev çağrısı , 1.0 hacmine dayalı olarak kâr sonucunu döndürür, hacim değeri yoksayılır, bkz. printscreen (calc_profit02.png) - hacim 0,5 iletilir, ancak sonuç 1.0 ile aynıdır

Bana sorunun ne olabileceğini söyle. teşekkürler

İşte bir doğrulama uzmanı - her şey yolunda gidiyor:

 //+------------------------------------------------------------------+
//|                                             OrderProfitCheck.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\AccountInfo.mqh>
CAccountInfo      m_account;                     // object of CAccountInfo class
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   string symbol= Symbol ();
   ENUM_ORDER_TYPE trade_operation= ORDER_TYPE_BUY ;
   double volume= 1.0 ;
   double price_open= 1.09350 ;
   double price_close= 1.0930 ;
   double profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print ( "Volume 1.0, profit -> " , DoubleToString (profit, 2 ));
   volume= 0.5 ;
   profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print ( "Volume 0.5, profit -> " , DoubleToString (profit, 2 ));
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---

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

ve sonuç:

 2019.09 . 30 07 : 47 : 21.688 OrderProfitCheck (EURUSD,H1)    Volume 1.0 , profit -> - 50.00
2019.09 . 30 07 : 47 : 21.688 OrderProfitCheck (EURUSD,H1)    Volume 0.5 , profit -> - 25.00
Dosyalar:
 
Söylemek. Kullanılmakta olan terminalin dilini programlı olarak öğrenmek mümkün mü ve nasıl?
 
Uladzimir Izerski :
Söylemek. Kullanılmakta olan terminalin dilini programlı olarak öğrenmek mümkün mü ve nasıl?

Onu ya terminalin Rusça dili olarak ya da farklıysa, o zaman İngilizce bilgi çıktısı olarak tanımlarım.

   if (InpTrailingStop!= 0 && InpTrailingStep== 0 )
     {
       string err_text=( TerminalInfoString ( TERMINAL_LANGUAGE )== "Russian" )?
                       "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!" :
                       "Trailing is not possible: parameter \"Trailing Step\" is zero!" ;
       //--- 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 );
        }
     }


Eklendi: TERMINAL_LANGUAGE numaralandırmasındaki tüm dilleri kaydettiğimi sanıyordum - ama bulamıyorum. Muhtemelen kayıp...

 
Herkese iyi günler, herhangi biri buraya eklemeye yardımcı olabilir mi, böylece SL ile sadece bir darbe olmaz, aynı zamanda çok veya birkaç tane ekler. Ve çalıştığı gibi, TP bir lot geri döndü.
 input double    Lot= 1 ;
input int       TakeProfit = 6 ;
input int       Stoploss   = 6 ;

int TP;
int SL;

CTrade trader;
bool Invertor;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {

   TP = TakeProfit;
   SL = Stoploss;

   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {

   double points;

   if (! PositionSelect ( _Symbol ))
     {
       if (Invertor)
         trader.Buy(Lot);
       else trader.Sell(Lot);
     }
   else
     {
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
        {
         points=( SymbolInfoDouble ( _Symbol , SYMBOL_BID )- PositionGetDouble ( POSITION_PRICE_OPEN ))/ _Point ;
         if (points>=TP)
           {
            trader.PositionClose( _Symbol );
            Invertor= true ;
           }

         if (points<=-SL)
           {
            trader.PositionClose( _Symbol );
            Invertor= false ;
           }
        }
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
        {
         points=( PositionGetDouble ( POSITION_PRICE_OPEN )- SymbolInfoDouble ( _Symbol , SYMBOL_ASK ))/ _Point ;
         if (points>=TP)
           {
            trader.PositionClose( _Symbol );
            Invertor= false ;
           }
         if (points<=-SL)
           {
            trader.PositionClose( _Symbol );
            Invertor= true ;
           }
        }
     }   
  }
 
Andrey990 :
Herkese iyi günler, herhangi biri buraya eklemeye yardımcı olabilir mi, böylece SL ile sadece bir darbe olmaz, aynı zamanda çok veya birkaç tane ekler. Ve çalıştığı gibi, TP bir lot geri döndü.

1. SEMBOL TARAFINDAN bir konum seçen işlevlerin kullanılmamasını şiddetle tavsiye ederim. Listede dizine göre konum seçen işlevleri kullanın.

2. Pozisyonun nasıl kapatıldığını öğrenmek için OnTradeTransaction'daki ENUM_DEAL_REASON numaralandırmasına bakmanız gerekir.

ENUM_DEAL_REASON ile örnek:

Zararı Durdur Kar Al

Kaybı Durdur ile kapatıyorsanız - hacmi ikiye katlayın, Kâr Al ile kapatıyorsanız - minimum hacmi ayarlayın. Bir ticaretin Zarar Durdur veya Kâr Al tarafından tetiklendiğini belirlemek için OnTradeTransaction'ı kullanın. 1625 derlemesinden başlayarak, harika bir ENUM_DEAL_REASON numaralandırması belirdi: ENUM_DEAL_REASON Nedenin açıklaması.. DEAL_REASON_SL İşlem, Zarar Durdurma işlemi sonucunda gerçekleştirildi DEAL_REASON_TP İşlem, Kar Al.. işleminin sonucu olarak gerçekleştirildi. OnTradeTransaction'da izlenir. Yani artık çok kolay ve en önemlisi bu işlemin Kâr Al veya Zarar Durdur tetikleyicisi sonucu olduğunu belirlemek garanti altına alındı. Şu anda (derleme 1626) bu EA yalnızca canlı olarak test edilebilir - bir çizelgeye atılarak veya gerçek veriler üzerinde hata ayıklama modunda (MetaEditor'da F5). Ayrıca, bir geçici çözüm uygularken: Tam olarak neyin işe yaradığını belirleyin: OnTradeTransaction prosedüründe Kâr Al veya Zararı Durdur: if (deal_symbol==m_symbol...

kod tabanı | 2017.07.13 07:42 | Vladimir Karputov | Danışmanlar | MetaTrader 5

 

Hesaba üçüncü taraf bir programa girmek ve onu yönetmek, peki, pozisyonları açmak / kapatmak için bir şekilde veri girmek mümkün müdür?

Yoksa sadece hesaba yüklenen robot aracılığıyla mı?

 

Göstergeleri MQL4'ten MQL5'e çeviriyorum, tamponlar ve "grafikler" hakkında bir soru. Gösterge 2 arabellek ve 1 arsa içerir:

#özellik göstergesi_tamponları 2
#property Indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_HESAPLAMALAR);
SetIndexBuffer(1,Array2,INDICATOR_DATA);


İlk tampon, hesaplamalar vb. için kullanılıyorsa ve ikinci tampon çizilecekse, o zaman:

İlk olarak, SetIndexBuffer() işlevinde zaten INDICATOR_CALCULATIONS ayarlanmışsa, ilk arabellek DRAW_NONE olarak ayarlanmalı mı?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

ikinci olarak, PlotIndexSetInteger() işlevinde soru işareti ( ? ) yerine yalnızca ikinci tamponun çizilmesi gerekiyorsa hangi dizin ayarlanmalıdır?

PlotIndexSetInteger( ? ,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


üçüncü olarak, DRAW_HISTOGRAM türünden iki stil kullanırsam, her biri için bir renk ayarlayabilir ve Yeşil ve kırmızı çubukların değiştiği Volumes göstergesindeki gibi bir histogram elde edebilirim ve DRAW_HISTOGRAM 2 kullanırsam iki renk de ayarlayabilir miyim bir çubuğa mı yoksa bu stil için sadece bir renk mi var?

 
The_Sheikh :

Göstergeleri MQL4'ten MQL5'e çeviriyorum, tamponlar ve "grafikler" hakkında bir soru. Gösterge 2 arabellek ve 1 arsa içerir:

#özellik göstergesi_tamponları 2
#property Indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_HESAPLAMALAR);
SetIndexBuffer(1,Array2,INDICATOR_DATA);


İlk tampon, hesaplamalar vb. için kullanılıyorsa ve ikinci tampon çizilecekse, o zaman:

İlk olarak, SetIndexBuffer() işlevinde zaten INDICATOR_CALCULATIONS ayarlanmışsa, ilk arabellek DRAW_NONE olarak ayarlanmalı mı?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

ikinci olarak, PlotIndexSetInteger() işlevinde soru işareti ( ? ) yerine yalnızca ikinci tamponun çizilmesi gerekiyorsa hangi dizin ayarlanmalıdır?

PlotIndexSetInteger( ? ,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


üçüncü olarak, DRAW_HISTOGRAM türünden iki stil kullanırsam, her biri için bir renk ayarlayabilir ve yeşil ve kırmızı çubukların değiştiği Volumes göstergesindeki gibi bir histogram elde edebilirim ve DRAW_HISTOGRAM 2 kullanırsam iki renk de ayarlayabilir miyim bir çubuğa mı yoksa bu stil için sadece bir renk mi var?

Neden kendinle böyle alay ediyorsun? Önce görüntülenen arabellekleri ve ardından yardımcı olanları atamanın sorunu nedir?

DRAW_HISTOGRAM2'ye 3 arabellek ve zorunlu bir sıra, ilk 2 değer arabelleği ve ardından bir renk arabelleği verilir. Ancak DRAW_HISTOGRAM ve DRAW_HISTOGRAM2 arasında öyle bir fark vardır ki, DRAW_HISTOGRAM sıfırdan arabellekteki değere, DRAW_HISTOGRAM2 bir değerinden çizilir. arabellek başka bir arabelleğin değerine.