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

 

hmm, garip bir durum, konuyla ilgili etkinliği artırdığım gibi, benim açımdan spesifik bir sorum vardı, ancak cevap yerine "neden buna ihtiyacınız var?"

Tamam, test cihazında TS'yi aynı anda birkaç TF'ye ölçeklendirmem gerekiyor, bunu CTrade SB kullanarak uygulamak istiyorum, işte bir örnek (2 örneğimden toplandı): her yeni çubuğu 9 TF'de bir siparişte açıyoruz Bir zaman, biletin ve bilet numarasının siparişin kapanıp kapanmadığını belirler? ve kapatılan düzenin yönü neydi?

MQL4'te test cihazının kodu şöyle görünecektir:

 //+------------------------------------------------------------------+
//|                                                        tst__.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
input int TP = 100 ;
input int SL = 100 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNewbar
  {
private :
   datetime           mnewtime;
   ENUM_TIMEFRAMES    mperiod;
public :
                     CNewbar()                        { mperiod= PERIOD_CURRENT ;  mnewtime= TimeCurrent (); }
                     CNewbar( ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime= TimeCurrent (); }
   bool               NewBar(){ datetime t= iTime ( NULL ,mperiod, 0 ); if (mnewtime<t){ mnewtime=t; return ( true ); } return ( false );  }
  };

ENUM_TIMEFRAMES   TF[ 9 ]={ PERIOD_M1 , PERIOD_M5 , PERIOD_M15 , PERIOD_M30 , PERIOD_H1 , PERIOD_H4 , PERIOD_D1 , PERIOD_W1 , PERIOD_MN1 };
CNewbar *BAR[ 9 ];
int ticket[ 9 ];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   for ( int i= 0 ;i< 9 ;i++) BAR[i]= new CNewbar(TF[i]);
   ArrayInitialize (ticket,- 1 );
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   for ( int i= 0 ;i< 9 ;i++) delete BAR[i];
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   for ( int i= 0 ;i< 9 ;i++)
       if (BAR[i].NewBar())
        {
         if (ticket[i]< 0 ) ticket[i]= OrderSend ( _Symbol ,OP_BUY, 0.1 ,Ask, 30 ,Ask-SL* _Point ,Ask+TP* _Point );
         if ( OrderSelect (ticket[i],SELECT_BY_TICKET) && OrderCloseTime()> 0 )
           {
             int cmd= 1 -OrderType();
             double open=cmd ? Bid : Ask;
             double tp = open - (cmd ? 1 : - 1 ) * TP * _Point ;
             double sl = open + (cmd ? 1 : - 1 ) * SL * _Point ;
            ticket[i]= OrderSend ( _Symbol ,cmd, 0.1 ,open, 30 ,sl,tp);
           }
        }
  }

test cihazı için bir koda ihtiyacınız var, yani optimize edicide minimum kontrol ve en hızlı çalışma

SB CTrade kullanarak bu kodu MQL5'te nasıl yazabilirim ???!!!

 
Igor Makanu :

hmm, garip bir durum, konuyla ilgili bir tür etkinliği artırdım, benim açımdan belirli bir sorum vardı, ancak bir cevap yerine "buna neden ihtiyacınız var?"

Tamam, test cihazında TS'yi aynı anda birkaç TF'ye ölçeklendirmem gerekiyor, bunu CTrade SB kullanarak uygulamak istiyorum, işte bir örnek (2 örneğimden toplandı): her yeni çubuğu 9 TF'de bir siparişte açıyoruz Bir zaman, biletin ve bilet numarasının siparişin kapanıp kapanmadığını belirler? ve kapatılan düzenin yönü neydi?

MQL4'te test cihazının kodu şöyle görünecektir:

SB CTrade kullanarak bu kodu MQL5'te nasıl yazabilirim ???!!!

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

Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5

Vladimir Karputov , 2019.07.21 12:56

Bu nedenle, temel bilgilerin temeli Pozisyon Kimliğidir ( POSITION_IDENTIFIER ), ancak pozisyon bileti değil. Bu sadece ağ nedeniyle önemlidir :

POSITION_IDENTIFIER

Pozisyon Kimliği, her yeni açılan pozisyona atanan ve kullanım ömrü boyunca değişmeyen benzersiz bir numaradır. Pozisyonu açan sipariş biletine karşılık gelir.

 

Pozisyon kimliği, onu açan, değiştiren veya kapatan her siparişte (ORDER_POSITION_ID) ve anlaşmada (DEAL_POSITION_ID) belirtilir. Bir pozisyonla ilişkili siparişleri ve anlaşmaları aramak için bu özelliği kullanın.

 

Netleştirme modunda bir pozisyon tersine çevrildiğinde (tek bir giriş/çıkış anlaşması ile), pozisyon kimliği POSITION_IDENTIFIER değişmez. Ancak aynı zamanda POSITION_TICKET, iptalle sonuçlanan siparişin bileti olarak değiştirilir. Riskten korunma modunda pozisyonun tersine çevrilmesi sağlanmaz.

uzun


Bu nedenle konum tanımlayıcısını (POSITION_IDENTIFIER) hatırlamanız ve izlemeniz gerekir.


Şimdi görev rafine edildi: ilk başlatmada, bir SATIN ALMA POZİSYONU açın ve bunu hatırlayın (DİKKAT: pozisyon tanımlayıcısını hatırlamanız gerekir, bileti değil). Pozisyon kapandıysa karşı pozisyonu açıyoruz: örneğin bir AL pozisyonu vardı, sonra kapandı, yani SATIŞ pozisyonu hemen açıldı.


Şimdi sorunu çözmek çok daha kolay olacak.


 
Vladimir Karputov :

Yardımı kaydırdım, CTrade SB'de konum tanımlayıcıyla çalışma yöntemlerini göremiyorum, yani. SB CTrade, bir siparişin açık mı yoksa kapalı mı olduğunu bağımsız olarak belirleyemiyor mu? son kapatılan siparişin türü neydi?

Bu amaçla hangi kütüphane kullanılmalıdır?

 
Igor Makanu :

Yardımı kaydırdım, CTrade SB'de konum tanımlayıcıyla çalışma yöntemlerini göremiyorum, yani. SB CTrade, bir siparişin açık mı yoksa kapalı mı olduğunu bağımsız olarak belirleyemiyor mu? son kapatılan siparişin türü neydi?

Bu amaçla hangi kütüphane kullanılmalıdır?

Eh, zaten yüzlerce kez söyledim - sözlükten "düzen" kelimesini atın. Bunu yapana kadar, devam edemezsiniz. Genel olarak, muhtemelen size yardımcı olamam. Üzüntü.

 
Vladimir Karputov :

Eh, zaten yüzlerce kez söyledim - sözlükten "düzen" kelimesini atın. Bunu yapana kadar, devam edemezsiniz. Genel olarak, muhtemelen size yardımcı olamam. Üzüntü.

Ve bana bunu nasıl anlayacağımı söyle:

GN       0        16 : 24 : 14.030     Core 1    2018.06 . 06 08 : 00 : 00    Sell market. Ticket = 20
JF       0        16 : 24 : 14.030     Core 1    2018.06 . 06 08 : 00 : 00    Sell market. Identifier = 0
FQ       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    ======closePosition======
HG       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    market buy 0.10 AUDUSD, close # 20 ( 0.73633 / 0.73637 / 0.73633 )
PH       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    deal # 21 buy 0.10 AUDUSD at 0.73637 done (based on order # 21 )
KJ       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    deal performed [ # 21 buy 0.10 AUDUSD at 0.73637 ]
IL       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    order performed buy 0.10 at 0.73637 [ # 21 buy 0.10 AUDUSD at 0.73637 ]
RN       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    CTrade:: OrderSend : market buy 0.10 position # 20 AUDUSD [done at 0.73637 ]
HN       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    Позиция с магиком 2544113114312914 , тикетом 20 и лотом 0.1 успешно закрыта.
LO       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    Очистка данных произведена.
CH       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    ======checkMargin======
OF       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    market buy 0.10 AUDUSD ( 0.73633 / 0.73637 / 0.73633 )
DS       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    deal # 22 buy 0.10 AUDUSD at 0.73637 done (based on order # 22 )
RM       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    deal performed [ # 22 buy 0.10 AUDUSD at 0.73637 ]
DS       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    order performed buy 0.10 at 0.73637 [ # 22 buy 0.10 AUDUSD at 0.73637 ]
FF       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    CTrade:: OrderSend : market buy 0.10 AUDUSD [done at 0.73637 ]
MJ       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    magic = 2544113114312914
RR       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    balance = 11308.94
JK       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    lot = 0.10
HQ       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    Buy market. Ticket = 22
CJ       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    Buy market. Identifier = 20
HR       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    ======closePosition======
FI       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    market sell 0.10 AUDUSD, close # 22 ( 0.74021 / 0.74025 / 0.74021 )
RF       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    deal # 23 sell 0.10 AUDUSD at 0.74021 done (based on order # 23 )
ID       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    deal performed [ # 23 sell 0.10 AUDUSD at 0.74021 ]
GM       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    order performed sell 0.10 at 0.74021 [ # 23 sell 0.10 AUDUSD at 0.74021 ]
NQ       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    CTrade:: OrderSend : market sell 0.10 position # 22 AUDUSD [done at 0.74021 ]
PO       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    Позиция с магиком 2544113114312914 , тикетом 22 и лотом 0.1 успешно закрыта.
FO       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    Очистка данных произведена.
CH       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    ======checkMargin======
OI       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    market sell 0.10 AUDUSD ( 0.74021 / 0.74025 / 0.74021 )
JO       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    deal # 24 sell 0.10 AUDUSD at 0.74021 done (based on order # 24 )
LM       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    deal performed [ # 24 sell 0.10 AUDUSD at 0.74021 ]
ND       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    order performed sell 0.10 at 0.74021 [ # 24 sell 0.10 AUDUSD at 0.74021 ]
LI       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    CTrade:: OrderSend : market sell 0.10 AUDUSD [done at 0.74021 ]
OJ       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    magic = 2544113114312914
RR       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    balance = 11335.85
DK       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    lot = 0.10
PN       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    Sell market. Ticket = 24
QE       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    Sell market. Identifier = 22
NR       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    ======closePosition======
NF       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    market buy 0.10 AUDUSD, close # 24 ( 0.73968 / 0.73989 / 0.73968 )
JI       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    deal # 25 buy 0.10 AUDUSD at 0.73989 done (based on order # 25 )
QK       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    deal performed [ # 25 buy 0.10 AUDUSD at 0.73989 ]
MM       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    order performed buy 0.10 at 0.73989 [ # 25 buy 0.10 AUDUSD at 0.73989 ]
PN       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    CTrade:: OrderSend : market buy 0.10 position # 24 AUDUSD [done at 0.73989 ]
DO       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    Позиция с магиком 2544113114312914 , тикетом 24 и лотом 0.1 успешно закрыта.
LP       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    Очистка данных произведена.
KK       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    ======checkMargin======
RI       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    market sell 0.10 AUDUSD ( 0.73933 / 0.73937 / 0.73933 )
GO       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    deal # 26 sell 0.10 AUDUSD at 0.73933 done (based on order # 26 )
OM       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    deal performed [ # 26 sell 0.10 AUDUSD at 0.73933 ]
JD       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    order performed sell 0.10 at 0.73933 [ # 26 sell 0.10 AUDUSD at 0.73933 ]
QI       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    CTrade:: OrderSend : market sell 0.10 AUDUSD [done at 0.73933 ]
HN       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    Sell market. Ticket = 26
CF       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    Sell market. Identifier = 0
 
Vladimir Karputov :

Eh, zaten yüzlerce kez söyledim - sözlükten "düzen" kelimesini atın. Bunu yapana kadar, devam edemezsiniz. Genel olarak, muhtemelen size yardımcı olamam. Üzüntü.

TAMAM? Soruyu tekrar yazayım:

CTrade:: ResultOrder() ile hatırlanan bir biletin nasıl kullanılacağı

keşfetmek:

1. Pozisyon kapandı mı?

2. Kapanan pozisyon ne tür bir anlaşmaydı?

3. Aynı anda 9 pozisyon, emir veya bilet ile çalışmanız gerekiyor veya ... Kendi takdirinize bağlı olarak bir hedge hesabında herhangi bir Terminoloji


Bu formülasyonda, sorum açık mı? (yukarıda yayınlanan MQl4 altında tekrarlanabilir örnek)

Not: Kelime sıralamasını unutamıyorum, ne yazık ki bu kelime yardımda diğer terimlerle birlikte kullanılıyor: https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade/ctraderequestorder

 
Igor Makanu :

hmm, garip bir durum, konuyla ilgili bir tür etkinliği artırdım, benim açımdan belirli bir sorum vardı, ancak bir cevap yerine "buna neden ihtiyacınız var?"

Bunun nedeni sorumluların beceriksizliğidir. Yazmam beş dakikamı aldı ve bir düzeltme denemesi yaptım.


MT4

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

Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5

fxsaber , 2019.07.21 12:54

 void OnTick ()
  {
   static int ticket1 = - 1 ;
   
   if (ticket1< 0 ) ticket1= OrderSend ( _Symbol ,OP_BUY, 0.1 ,Ask, 30 ,Ask- 100 * _Point ,Ask+ 100 * _Point );

   if ( OrderSelect (ticket1,SELECT_BY_TICKET) && OrderCloseTime())
    {
     int cmd= 1 -OrderType();
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : - 1 ) * 100 * _Point ;
     double sl = open + (cmd ? 1 : - 1 ) * 100 * _Point ;
     ticket1= OrderSend ( _Symbol ,cmd, 0.1 ,open, 30 ,sl,tp);
    }
  }


MT5

 #include <Trade\Trade.mqh>

#define Bid SymbolInfoDouble ( _Symbol , SYMBOL_BID )
#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

void OnTick ()
{
   static CTrade Trade; // Не стал возиться с Deviation.
   static ulong ticket1 = 0 ;
 
   if (!ticket1)
    ticket1 = Trade.PositionOpen( _Symbol , ORDER_TYPE_BUY , 0.1 , Ask, Ask - 100 * _Point , Ask + 100 * _Point ) ? Trade.ResultOrder() : 0 ;
   else if (! PositionSelectByTicket (ticket1) && HistorySelectByPosition (ticket1))
  {
     ENUM_ORDER_TYPE cmd = ( ENUM_ORDER_TYPE ) HistoryOrderGetInteger ( HistoryOrderGetTicket ( HistoryOrdersTotal () - 1 ), ORDER_TYPE );
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : - 1 ) * 100 * _Point ;
     double sl = open + (cmd ? 1 : - 1 ) * 100 * _Point ;
    ticket1 = Trade.PositionOpen( _Symbol , cmd, 0.1 , open, sl, tp) ? Trade.ResultOrder() : 0 ;
  }
}


Bunu yazmak için güçlü bir bilgili olmanıza gerek yok, sadece MT5'in temellerini bilmeniz yeterli.


ZY Netleştirmede, kapalı bir pozisyonun türünü belirlerken küçük bir nüans vardır. Ama burada bunun bir önemi yok.

 
fxsaber :

Bunu yazmak için güçlü bir bilgili olmanıza gerek yok, sadece MT5'in temellerini bilmeniz yeterli.

Sayesinde!

Evet, "beş satır" yazmada SB'nin yardımıyla işe yaramadıysa bir çözüm aradığım şey buydu.

Ancak bir SB CTrade'in sorunumu çözemeyeceğini ne kadar anladım? Ayrıca CPositionInfo kullanmak gerekli miydi? - aynı anda birkaç TF'de 9 pozisyona eşlik etmek istersem?

Not: Akıllı TV'de oturuyorum ve MQL5 yardımında geziniyorum - alım satım işlevleri oldukça iyi tanımlanmış, SB kullanımı şüpheli .... ilkel stratejiler SB'yi kullanmak mantıklı görünüyor, biraz daha karmaşık - işlevsellik yetersiz veya bariz kullanım değil, belki pratik gerekiyor - daha fazla "bükmeye" çalışacağım "SB


Tekrar teşekkürler!

 
fxsaber :

Bunun nedeni sorumluların beceriksizliğidir. Yazmam beş dakikamı aldı ve bir düzeltme okuma girişimi.


MT4


MT5


Bunu yazmak için güçlü bir bilgili olmanıza gerek yok, sadece MT5'in temellerini bilmeniz yeterli.


PS Netleştirmede, kapalı bir pozisyonun türünü belirlerken küçük bir nüans vardır. Ama burada bunun bir önemi yok.

tam burada

 ENUM_ORDER_TYPE cmd = ( ENUM_ORDER_TYPE ) HistoryOrderGetInteger ( HistoryOrderGetTicket ( HistoryOrdersTotal () - 1 ), ORDER_TYPE );

olası bir hata var.

Tarihsel listede, siparişler bu listede göründükleri sırayla düzenlenmez. Kütüphaneyi geliştirirken bununla karşılaştım. Ben sadece buna güvendim. Ancak her şeyin o kadar basit olmadığı ortaya çıktı. Sırayla limit ve stop emirleri yerleştirmeyi deneyin: limit -> stop -> limit -> stop -> limit -> stop ve her birini herhangi bir sırayla silerek, geçmiş listede hangisinin en son kaydedildiğini görün. Şaşıracaksın.

 
Artyom Trishkin :

tam burada

olası bir hata var.

Tarihsel listede, siparişler bu listede göründükleri sırayla düzenlenmez. Kütüphaneyi geliştirirken bununla karşılaştım. Ben sadece buna güvendim. Ancak her şeyin o kadar basit olmadığı ortaya çıktı. Sırayla limit ve stop emirleri yerleştirmeyi deneyin: limit -> stop -> limit -> stop -> limit -> stop ve her birini herhangi bir sırayla silerek, geçmiş listede hangisinin en son kaydedildiğini görün. Şaşıracaksın.

Hata yok çünkü liste, HistorySelectByPosition aracılığıyla oluşturulur.

Neden: