Sipariş numaralandırma döngüsünün organizasyonu - sayfa 14

 
Andrey Khatimlianskii :

Ve ne, OrderClose'un anlaşmayı kapatması garanti mi?

Garanti edilmez, ancak bu durum için kodda bir kontrol vardır. Her OnTick çağrısı bir öncekinden bağımsızdır.

 
fxsaber :

Garanti edilmez, ancak bu durum için kodda bir kontrol vardır. Her OnTick çağrısı bir öncekinden bağımsızdır.

Tamam, bir sonraki onay işaretini kapatmak yeterli olacaktır.

 
@Artyom Trishkin , @Andrey Khatimlianskii , Katıldığınız için teşekkürler! MT5 kodu hakkında kimsenin sesini çıkarmamış olması üzücü. Görünüşe göre, her şeyin yolunda olduğunu düşünüyorlar.
 
fxsaber :
@Artyom Trishkin , @Andrey Khatimlianskii , Katıldığınız için teşekkürler! MT5 kodu hakkında kimsenin sesini çıkarmamış olması üzücü. Görünüşe göre, her şeyin yolunda olduğunu düşünüyorlar.

Tabii ki örnek, MT5'te her şeyin hiç de doğru olmadığını cevaplamak için verildi. Sorunu gösteren bir örnek

 // Пример неправильного считывания торгового окружения на каждом тике
// Скрипт эмулирует два тика ТС, которая должна открыть одну позицию, если ее нет.

#include <Trade/Trade.mqh>

// Возвращает количество позиций по символу
int GetAmountPositions( const string Symb )
{
   int Res = 0 ;
  
   // Этот MQL5-код с ошибкой
   for ( int i = PositionsTotal () - 1 ; i >= 0 ; i--)
     if ( PositionGetSymbol (i) == Symb)
      Res++;

/*
   // В MT4 такой код выполняется без ошибки
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
      Res++;
*/       
   return (Res);
}

// Пример OnTick
void ExampleOnTick()
{
   static CTrade Trade;
  
   // Если нет позиции, открываем
   if (!GetAmountPositions( _Symbol ))
    Trade.Buy( 1 );    
}

// Эмуляция прихода двух Tick-событий
void OnStart ()
{
  ExampleOnTick(); 
  
   Sleep ( 10 ); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}

Ne dersiniz, bu betiği pozisyonsuz bir sembol üzerinde çalıştırırsanız sonuç ne olur?

Doğru cevap: Bir veya iki pozisyon açılacaktır.

 
fxsaber :

Tabii ki örnek, MT5'te her şeyin hiç de doğru olmadığını cevaplamak için verildi. Sorunu gösteren bir örnek

Ne dersiniz, bu betiği pozisyonsuz bir sembol üzerinde çalıştırırsanız sonuç ne olur?

Doğru cevap: Bir veya iki pozisyon açılacaktır.

Sonuç olarak, Codebase'deki MT5 Expert Advisor'ların büyük çoğunluğu yanlış yazılmıştır!

 
fxsaber :
Bu ifadeye çok az kişi itiraz edebilir.

Bu evrensel bir kuraldır. Ancak çok azı bunun MT5'teki uygulamasını düşünüyor. Bu nedenle, en basit TS için bir şablon yazdım (neredeyse hepsi kod tabanındadır)

Nedense bazı kişiler aynı araçlar için daha fazla kod yazarlar. Ama aslında, bu kod da aynı şeyi yapıyor. Çoğu TS, yalnızca BuySignal ve SellSignal'in yazılmasını gerektirir. Başka bir şeye gerek yok.

Örnek bir şablon özel olarak SB kullanılarak yazılmıştır. Bu nedenle, soru MT5 uzmanları içindir, kod doğru mu?

Yanlışlıkla bu konuya girdim.Genel olarak, uzun zamandır strateji şablonlarını tartışan bir başlık başlatmak istiyordum. Şablonunuz doğru olduğunu düşündüğüm şeye yeterince yakın (kendim için okunabilir), ancak yine de altında tüm bir madencilik ve işleme tesisinin gizlendiği OnTick'e tek bir işlev çağrısı eklenmesinden hoşlanmıyorum.

Bir zamanlar MetaEditor: Building power on templates . O zamandan beri dil değişti, editör şablonu yok. Bu konuyu tartışmak ilginç olurdu (ayrı bir başlıkta mümkündür) ve bu konuyla ilgili bir makale almak da güzel olurdu. Kod yazarken, bir sınıfın veya makronun yöntemlerine girmeden bir bakışta stratejiyi okumaya çalışmanız gerektiğine inanıyorum.

 
fxsaber :

Sonuç olarak, Codebase'deki MT5 Expert Advisor'ların büyük çoğunluğu yanlış yazılmıştır!

Her zaman olduğu gibi - kategorik olarak. Kodunuzu okumamış olmama rağmen olamaz.

 
Rashid Umarov :

Yanlışlıkla bu konuya girdim.Genel olarak, uzun zamandır strateji şablonlarını tartışan bir başlık başlatmak istiyordum. Şablonunuz doğru olduğunu düşündüğüm şeye yeterince yakın (kendim için okunabilir), ancak yine de altında tüm bir madencilik ve işleme tesisinin gizlendiği OnTick'e tek bir işlev çağrısı eklenmesinden hoşlanmıyorum.

OnTick == Strateji yaparsanız, şablon küçültülür / müstehcen boyutlara basitleştirilir.

Bir zamanlar MetaEditor: Building power on templates . O zamandan beri dil değişti, editör şablonu yok. Bu konuyu tartışmak ilginç olurdu (ayrı bir başlıkta mümkündür) ve bu konuyla ilgili bir makale almak da güzel olurdu. Kod yazarken, bir sınıfın veya makronun yöntemlerine girmeden bir bakışta stratejiyi okumaya çalışmanız gerektiğine inanıyorum.

Böylece her iki platform için şablon gösterildi. O kadar basittir ki, MT5 için temelde yanlış olsa da, onu tartışmak zordur. Ve böylece CExpert'iniz de var. Kendim bakmadım - korkutucu.

 
Rashid Umarov :

Her zaman olduğu gibi - kategorik olarak. Kodunuzu okumamış olmama rağmen olmayabilir.

Okuyorsun, fikrin çok ilginç.

 
fxsaber :

Tabii ki, MT5'te her şeyin hiç de doğru olmadığını cevaplamak için örnek verildi. Sorunu gösteren bir örnek

Ne dersiniz, bu betiği pozisyonsuz bir sembol üzerinde çalıştırırsanız sonuç ne olur?

Doğru cevap: Bir veya iki pozisyon açılacaktır.

Ve GetAmountPositions'ı normal OnTradeTransaction ile değiştirirseniz ???

Aşağı yukarı şöyle:

 #include <Trade/Trade.mqh>
   int Res = 0 ;

// Возвращает количество позиций по символу
/*********************TradeTransaction function*********************/
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
{
   if (trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol )
   {
     /******************** Если открылась позиция********************/
     if ( PositionSelectByTicket (trans.position))
     Res++;
     /******************** Если закрылась позиция********************/
     if (! PositionSelectByTicket (trans.position))
     Res--;
   }
} /*******************************************************************/

// Пример OnTick
void ExampleOnTick()
{
   static CTrade Trade;
  
   // Если нет позиции, открываем
   if (Res == 0 )
    Trade.Buy( 1 );    
}

// Эмуляция прихода двух Tick-событий
void OnStart ()
{
  ExampleOnTick(); 
  
   Sleep ( 10 ); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}