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

 
fxsaber :

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

Pozisyonda henüz emrin dikkate alınmadığı durumda daha doğru olduğunu düşünüyorum, dikkate alınmasını bekleyin.
 
Комбинатор :
Pozisyonda henüz emrin dikkate alınmadığı durumda daha doğru olduğunu düşünüyorum, dikkate alınmasını bekleyin.

Anlamadım.

 
Normal OrderSend'in koşullu uygulama şeması (zaman aşımı olmadan)
 static MqlTradeResult LastResult = { 0 };

void OnTradeTransaction ( const MqlTradeTransaction &, const MqlTradeRequest &, const MqlTradeResult &Result )
{ 
  LastResult = Result;
}

// Условный алгоритм реализации штатной OrderSend
bool OrderSend ( const MqlTradeRequest &Request, MqlTradeResult &Result )
{  
   bool Res = OrderSendAsync (Request, Result);
  
   if (Res)
  {
     while (LastResult.request_id != Result.request_id)
       OnTradeTransaction (); // условно-схематичный вызов
          
    Result = LastResult;    
    Res = (Result.retcode == TRADE_RETCODE_PLACED ) ||
          (Result.retcode == TRADE_RETCODE_DONE ) ||
          (Result.retcode == TRADE_RETCODE_DONE_PARTIAL );

    LastResult.request_id = 0 ;
  }
    
   return (Res);
}


Bu diyagram, aynı MetaQuotes- Demo'da OrderSendAsync aracılığıyla bir piyasa emri verirken, emrin gerçekleştiği veya reddedildiği ana kadar ilgili emri verme olayını yakalamanın imkansız olduğunu açıkça göstermektedir. Onlar. MT5, OrderSendAsync'in ara sonuçlarını değerlendirmek için herhangi bir basit mekanizmaya sahip değildir.

 

Konuyla ilgili görünüyor

Bu kodu not etmek istiyorum:

 if ( ! OrderSend (request,result) ) PrintFormat (" OrderSend error %d", GetLastError ());
else Print (result.price);

DEMO'da kusursuz çalışıyor (sonuç=istek),

ancak GERÇEK'te - sonucu elde etmek imkansızdır (sonuç=0.0). ... birkaç saniye beklemezseniz.

 
Ivan Ivanov :

Konuyla ilgili görünüyor

Bu kodu not etmek istiyorum:

DEMO'da kusursuz çalışıyor (sonuç=istek),

ancak GERÇEK'te - sonucu elde etmek imkansızdır (sonuç=0.0). ... birkaç saniye beklemezseniz.

Eksik veri - günlükler, OrderSend'den sonraki yapı alanı değerleri, ticaret sunucusu adı.

 
fxsaber :

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.

 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++;   // если мы сюда попадаем при проверке состояния, не запускать стратегию вообще, т.к. это промежуточное состояние.
 
Комбинатор :

Bir sonraki tikte bir ticaret sinyali olmayabilir. MT4 stilini kendim kullanıyorum, bu yüzden bu tür "pozisyonları" görmeden edemiyorum ve herhangi bir sorun yaşamıyorum.

 
fxsaber :

Eksik veriler - günlükler, OrderSend'den sonraki yapı alanı değerleri, ticaret sunucusu adı.

 //+------------------------------------------------------------------+
//|                                                      TestBUY.mq5 |
//|                        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"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{ //--- объявление и инициализация запроса и результата
   MqlTradeRequest request={ 0 };
   MqlTradeResult result={ 0 };
//--- параметры запроса
  request.action = TRADE_ACTION_DEAL ;
  request.symbol= _Symbol ; 
  request.volume= 0.01 ;
  request.type= ORDER_TYPE_BUY ;
  request.price= SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
  request.deviation= 5 ;
  request.magic= 1234 ;
  request.tp= 0.0 ;
  request.comment= DoubleToString (request.price, _Digits );
//--- отправка запроса
   if ( ! OrderSend (request,result) )
     PrintFormat ( "OrderSend error %d" , GetLastError ()); // если отправить запрос не удалось, вывести
//--- информация об операции
   PrintFormat ( "retcode=%u deal=%I64u order=%I64u" ,result.retcode,result.deal,result.order, " NewOrder" );
}


2018.02.20 15:20:35.845 İşlem emri #66745055 piyasada 0.01 / 0.01 EURUSD satın al 610.625 ms'de yapıldı

2018.02.20 15:20:35.935 Ticaret anlaşması #5461453 1.23403'ten 0.01 EURUSD satın al yapıldı (66745055 numaralı siparişe göre)

2018.02.20 15:20:35.845 TestBUY (EURUSDeur,M15) retcode=10009 anlaşma=0 sipariş=66745055

İstek tamamlandıysa (10009) neden anlaşma=0

 
Ivan Ivanov :

İstek tamamlandıysa (10009) neden anlaşma=0

İşte tartışma burada başladı . Tüm detaylar için linklere bakınız.

OrderSend'in kusursuz çalışması için bir çözüm var ama bu reklamcılık olacak.

 
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 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.

 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++;   

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

İlgilenen herkesi bu konuyu tartışmaya davet ediyorum. Bu konudaki fikrim şudur:


  1. Sunucuya sipariş gönderme
  2. Sonunda iptal edilebilecek bir piyasa emri belirir, ancak bunu zaten bir pozisyon olarak saydık mı?
 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++;   

Bu döngü, konum kimliğine (ID sıfır) sahip olmayan bir sipariş bulunursa bir konum ekler.

Bir pozisyon daha geri döndük.

Sipariş sunucu tarafından iptal edilirse ne olur?

...

Bana öyle geliyor ki, piyasa emirlerini hesaba katarken - eğer bulunursa - örneğin, YANLIŞ_DEĞER - pozisyonlar sıfırdan az olamaz. Bu, hesaplanmamış bir piyasa emri olduğuna dair bir sinyal olacaktır. Ancak pozisyon sayısını eklemeyin.