Ticaret ortamıyla çalışırken yaygın hatalar ve bunları ortadan kaldırmanın yolları

 
Bu konuda, çeşitli algoritmalarda terminalin ticaret ortamıyla çalışırken yaygın hataları, bunların ortadan kaldırılması ve gelecekte kaçınılması için yöntemleri tartışacağız.
 
TAMAM.
Tohum için:
EA, son kapatılan siparişin yönünü (veya kârını, ...) analiz eder. Sonuncusu 2 gün önce kapandı.
Ve tüccar tarih derinliğini 1 gün olarak belirledi.
OrdersHistoryTotal() artık bu siparişi görmez.
Karar?
 
Andrei Fandeev :
TAMAM.
Tohum için:
EA, son kapatılan siparişin yönünü (veya kârını, ...) analiz eder. Sonuncusu 2 gün önce kapandı.
Ve tüccar tarih derinliğini 1 gün olarak belirledi.
OrdersHistoryTotal() artık bu siparişi görmez.
Karar?

MT4 için - bence, kesinlikle, danışmanı başlatırken, gerekli geçmiş derinliğini kullanma ihtiyacı hakkında kullanıcıya bir uyarı verin.

MT5, geçmişi istediğiniz derinliğe indirmenize izin verir.

 
Artyom Trishkin :

MT4 için - bence, kesinlikle, danışmanı başlatırken, gerekli geçmiş derinliğini kullanma ihtiyacı hakkında kullanıcıya bir uyarı verin.

Kullanıcıya güvenmek kötü bir fikirdir. Doğrulama gerekiyor.
Artyom, ayarlanan geçmiş derinliğinin değerini almak için Get in MT4'ü bulamadım.
Programlı olarak elde etmek gerçekten imkansız mı?

 
Andrei Fandeev :

Kullanıcıya güvenmek kötü bir fikirdir. Doğrulama gerekiyor.
Artyom, ayarlanan geçmiş derinliğinin değerini almak için Get in MT4'ü bulamadım.
Programlı olarak elde etmek gerçekten imkansız mı?

Gerçekten.

 

Ticaret ortamıyla çalışmanın, Uzman Danışmanlar yazmanın iki paradigması vardır.

  1. Olay girişleri (OnTick, OnTimer, vb.) birbirine bağlıdır. ZORUNLU (önbellek gibi hızlandırma için değil, performans için) olaylar arasında sahip olmanız gereken bilgiler vardır. Örneğin, OrderSendAsync sonucunu kaydetmeniz ve OnTradeTransaction içinde kullanmanız gerekir. Önbellekler zorunlu bilgi DEĞİLDİR ve yalnızca hızlandırma için kullanılır. Bu nedenle, hemen dikkate alınmazlar.
  2. Olay girişleri (OnTick, OnTimer, vb.) birbirine bağlı DEĞİLDİR. Her giriş temiz bir sayfadır. Yaklaşık olarak, her etkinlik için kendi başınıza çalıştırdığınız bir Komut Dosyası gibi.
MT4'te muhtemelen her şey ikinci seçenekle çözülebilirdi. MT5 çok net değil.


İkinci seçeneğin birinciye göre avantajları

  • Algoritmayı herhangi bir yerde (normal ve anormal olarak) sonlandırabilirsiniz.
  • Herhangi bir yerden başla/devam et.
  • Yüksek güvenilirlik.


Dezavantajları

  • Test Cihazında, performans açısından ilk seçeneğe göre daha düşük olacaktır.
  • "Sıfırdan" mantık sizi biraz "mantıksız" kod yazmaya zorlar, bu da ilk aşamada alışmayı gerektirir.

 

Ticaret ortamı API'leri nasıl karşılaştırılır? Çok sayıda farklı araç hayal edin. TS'yi güvenilir kodda minimum çabayla uygulamamıza izin verecek ideal sanal API'mizi hayal edelim.

Bu çok ideal sanal API'yi gerçek bir API'den sarmalayıcı olarak oluşturmak mümkünse, orijinal API mükemmeldir. Bir sarmalayıcı oluşturmak için ne kadar çaba ve zamana rağmen.


MT4 ve MT5 bu konuda mükemmel API'lerdir. Yalnızca orijinal API'ler karmaşıktır, ancak harika bir sarmalayıcı yazmaya izin verirler (mimari/teknik kısıtlama yoktur), bu da iyi oldukları anlamına gelir.

Bu nedenle MT5'in MT4'ten daha karmaşık olduğunu söylediklerinde, kullandıkları MT4 wrapper'ı kadar kullanışlı olan bir MT5 wrapper'ına henüz rastlamadıklarını (belki de henüz yazılmamıştır) kastetmektedirler.


Genel olarak, her iki platform da düşük seviyeli API'lerden tek bir yüksek seviyeli API (sarmalayıcı) oluşturmanıza izin verir. Dolayısıyla ticaret ortamı API'sinin karmaşıklığı onlar için eşittir!

 

MT4'ün oldukça yüksek seviyeli bir kaynak API'si vardır, bu nedenle çok az kişi daha genel amaçlı bir sarmalayıcı yazmaya çalışır. Ancak MT5 ile işler farklıdır - orijinal düşük seviyeli API, en azından bir tür sarmalayıcı yazmayı GEREKTİRİR. Bu nedenle, bu konuda sarmalayıcıların her birinin özelliklerini tartışmanın pek bir anlamı yoktur. Bunun yerine, sargının hala gerekli olduğunu göstermek önemlidir. Yüksek seviyeli bir API yazarken düşük seviyeli bir API'nin hangi özelliklerinin hala dikkate alınması gerekir.

В общем, обе платформы позволяют из низкоуровневых API создать единый высокоуровневый API (обертка). Так что сложности API торговых окружений у них равны!

Bu açıklamaya dayanarak, kolaylık açısından bir MT4 kodundan hiçbir şekilde aşağı olmayan bir MT5 kodunun nasıl yazılacağını öğrenmeniz gerekir. Sarma API'si farklı olabilir (kural olarak, bu sözdizimidir), ancak mimari olarak MT5, MT4'ten daha düşük olmamalıdır, aksi takdirde vurgulanan ifadenin anlamı kaybolur. Bu nedenle, daha hantal MT5 kodu bir eleştiri nedeni olarak değil, onu MT4'ten daha az kullanışlı olmayan bir ambalaja dikmek için bir yardım olarak alınmalıdır.

 
Basit bir MT4 TS şablonu alın

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

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

fxsaber , 2018.02.15 23:19

 // Шаблон большинства ТС

#property strict // обязательно

// Сигнал на покупку
bool BuySignal( const string Symb ) { return ( true ); }

// Сигнал на продажу
bool SellSignal( const string Symb ) { return ( false ); }

// Находит ордер соответствующего типа
bool OrdersScan( const string Symb, const int Type )
{
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS ) && ( OrderType () == Type) && ( OrderSymbol () == Symb))
       return ( true );    
    
   return ( false );  
}

// Торговое действие на сигнал
bool Action( const string Symb, const int Type, const double Lots = 1 )
{
   bool Res = true ;    
  
   // Закрыли противоположные сигналу позиции
   while ((OrdersScan(Symb, 1 - Type)) && (Res = OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 100 )));

   // Открыли позицию по сигналу
   return (Res && !OrdersScan(Symb, Type) && OrderSend (Symb, Type, Lots, SymbolInfoDouble (Symb, Type ? SYMBOL_BID : SYMBOL_ASK ), 100 , 0 , 0 ));
}

// Шаблон торговой стратегии
void Strategy( const string Symb )
{
   if (BuySignal(Symb))
    Action(Symb, OP_BUY );
   else if (SellSignal(Symb))
    Action(Symb, OP_SELL );
}

void OnTick ()
{
  Strategy( _Symbol );
}

MT4'ün rahatlığını hiç göstermez, sadece karşılaştırma için bir başlangıç noktası olarak hizmet eder. Bu, bir MT5 sargısının taşıması gereken daha düşük kolaylık düzeyidir. Şablon, ikinci paradigmaya göre yazılmıştır.


Aynı şeyi MT5'e de yazıyoruz gibi görünüyor.

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

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

fxsaber , 2018.02.15 22:30

 // Шаблон большинства ТС

#include <Trade/Trade.mqh>

// Сигнал на покупку
bool BuySignal( const string Symb ) { return ( true ); }

// Сигнал на продажу
bool SellSignal( const string Symb ) { return ( false ); }

// Находит позицию соответствующего типа
bool PositionsScan( const string Symb, const ENUM_POSITION_TYPE Type )
{
   for ( int i = PositionsTotal () - 1 ; i >= 0 ; i--)
     if (( PositionGetSymbol (i) == Symb) && ( PositionGetInteger ( POSITION_TYPE ) == Type))
       return ( true );    
    
   return ( false );  
}

// Торговое действие на сигнал
bool Action( const string Symb, const ENUM_POSITION_TYPE Type, const double Lots = 1 )
{
   static CTrade Trade;    
   bool Res = true ;    
  
   // Закрыли противоположные сигналу позиции
   while ((PositionsScan(Symb, ( ENUM_POSITION_TYPE )( 1 - Type))) && (Res = Trade.PositionClose( PositionGetInteger ( POSITION_TICKET ))));

   // Открыли позицию по сигналу
   return (Res && !PositionsScan(Symb, Type) && (Type ? Trade.Sell(Lots, Symb) : Trade.Buy(Lots, Symb)));
}

// Шаблон торговой стратегии
void Strategy( const string Symb )
{
   if (BuySignal(Symb))
    Action(Symb, POSITION_TYPE_BUY );
   else if (SellSignal(Symb))
    Action(Symb, POSITION_TYPE_SELL );
}

void OnTick ()
{
  Strategy( _Symbol );
}

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?


Bir işlev, bir sarmalayıcıya olan ihtiyacı gösteren kırmızı ile işaretlenmiştir. Onun sorunu burada açıklanmıştır. Birisi bunun, eski zamanlarda Uyku yoluyla çözülen, OrderSend'den sonra bir pozisyonun açılmasını bekleyen eski bir pozisyon yeniden açma sorunu olduğunu hatırlayacaktır. Ama aslında bu sorunun OrderSend ile alakası yok. Ticaret ortamını doğru okuyabilmeniz gerekir.

 
fxsaber :

Ticaret ortamını doğru okuyabilmeniz gerekir.

Basit bir örnek için doğru seçenek

 // Возвращает количество позиций по символу
int GetAmountPositions( const string Symb )
{
   int Res = 0 ;
  
   for ( int i = PositionsTotal () - 1 ; i >= 0 ; i--)
     if ( PositionGetSymbol (i) == Symb)
      Res++;
      
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     if ( OrderGetTicket (i) && ( OrderGetInteger ( ORDER_TYPE ) <= ORDER_TYPE_SELL ) &&
         ! OrderGetInteger ( ORDER_POSITION_ID ) && ( OrderGetString ( ORDER_SYMBOL ) == Symb))
      Res++;   

/*
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
      Res++;
*/       
   return (Res);
}

Kısaca anlamı şudur: Bir piyasa emri varsa bunun da bir "pozisyon" olduğunu düşünün. Bir sarma konumu olduğu için tırnak içinde. Vurgulanan kod, kural olarak hiçbir yerde görünmez. Ancak pozisyonların yeniden açılmasını önlemenizi sağlar. Burada en ilginç olanı kırmızı ile vurgulanmıştır. Bu çipe olan ihtiyaç hemen fark edilmez.

Gerçek şu ki, sözde kapanış piyasa emirleri var. Aynı SL/TP. Bu tür piyasa emirlerinin "pozisyon" olarak görülmeyeceği açıktır. Evet ve kendisinin kapatmak için verdiği emirler benzer. Burada vurgulanan koşul, karşılık gelen filtredir.


PS Bu kodu buraya yapıştırın ve demo sunucusundaki sonucu kontrol edin.

 
fxsaber :

Basit bir örnek için doğru seçenek

Kısaca anlamı şudur: Bir piyasa emri varsa bunun da bir "pozisyon" olduğunu düşünün. Bir sarmalayıcı konumu olduğu için tırnak içinde. Vurgulanan kod, kural olarak hiçbir yerde görünmez. Ancak pozisyonların yeniden açılmasını önlemenizi sağlar. Burada en ilginç olanı kırmızı ile vurgulanmıştır. Bu çipe olan ihtiyaç hemen fark edilmez.

Gerçek şu ki, sözde kapanış piyasa emirleri var. Aynı SL/TP. Bu tür piyasa emirlerinin "pozisyon" olarak görülmeyeceği açıktır. Evet ve kendisinin kapatmak için verdiği emirler benzer. Burada vurgulanan koşul, karşılık gelen filtredir.


PS Bu kodu buraya yapıştırın ve demo sunucusundaki sonucu kontrol edin.

Soru: Bir ticaret talebi gönderdikten sonra, bir sonraki tıklamaya kadar sunucu tarafından bir piyasa emri verilmezse ne olur?

Neden: