FORTS: Yeni başlayanlara yardımcı olmak için - sayfa 5

 
Mikhail Filimonov :

Sık kullanılan ve kullanışlı özellikler:  

Yeniden tasarlanan GetPositionPrice() işlevi:

Bu fonksiyon yanlış sonucu gösterir, daha doğrusu istediğimiz sonucu göstermez. Anlamaya başladım, belgelerde yazıldığı gibi, Pozisyon Kimliğinin bir geri alma sırasında (yani bir giriş/çıkış anlaşması sırasında) değişmediği ortaya çıktı:

https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties

Bir pozisyonun tersine çevrilmesi, kimliğini, iptalle sonuçlanan siparişin biletiyle değiştirir.

GetPositionPrice'ınız, bir geri dönüş olması durumunda 2 veya daha fazla farklı yönlendirilmiş pozisyonu karıştırabilir ve bunlar için ortalama fiyatı hesaplar. Böyle bir ortalama pozisyon fiyatının pratik bir anlamı yoktur.

Peki, Pozisyon Kimliği bir geri dönüş sırasında değişiyor mu, değişmiyor mu?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
geri giderken pozisyon numarası değişmez
 
Ve bir giriş/çıkış anlaşması ile önceki pozisyonu hangi hacmin kapattığını ve neyin yeni bir pozisyon açtığını nasıl belirleyebilirsiniz?
 
igorbel :
Ve bir giriş/çıkış anlaşması ile önceki pozisyonu hangi hacmin kapattığını ve neyin yeni bir pozisyon açtığını nasıl belirleyebilirsiniz?
Mevcut açık ile karşılaştırılabilir. Ama pozisyon tarihini kimliğe göre incelemek daha iyidir, ki bu çevirme sırasında değişmez... Hacimleri al/sat yardımcı olması için.
 
Dennis Kirichenko :
Mevcut açık ile karşılaştırılabilir. Ama pozisyon tarihini kimliğe göre incelemek daha iyidir, ki bu çevirme sırasında değişmez... Hacimleri al/sat yardımcı olması için.

Son zamanlarda Pozisyon Kimliği tersine çevrildiğinde DEĞİŞİKLİKLER. Bununla ilgili belgeler zaten güncellendi....

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.

 

Bir pozisyonun tersine çevrilmesi, kimliğini, iptalle sonuçlanan siparişin biletiyle değiştirir.

uzun

 
Dennis Kirichenko :
Mevcut açık ile karşılaştırılabilir. Ama pozisyon tarihini kimliğe göre incelemek daha iyidir, ki bu çevirme sırasında değişmez... Hacimleri al/sat yardımcı olması için.

Bu bir seçenek değil. Bir önceki pozisyon, tersine çevirme vb. nedenlerle de açılabilir. Belki bir seçenek, ama açıkçası en iyisi değil.

 
Andrey Barinov :

Son zamanlarda Pozisyon Kimliği tersine çevrildiğinde DEĞİŞİKLİKLER. Bununla ilgili belgeler zaten güncellendi....

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.

 

Bir pozisyonun tersine çevrilmesi, kimliğini, iptalle sonuçlanan siparişin biletiyle değiştirir.

uzun

Böyle yazılmış, ama gerçekte hiçbir şey değişmiyor.

İsterseniz, kodum:

 long pos_id1,pos_id2,pos_id3;
   ulong deal1_ticket=xxx;
   ulong deal2_ticket=xxx;
   ulong deal3_ticket=xxx;
   if (! HistoryDealSelect (deal1_ticket))
       Print ( __FUNCTION__ + ": deal 1 not selected. Error=" , GetLastError ());   
   pos_id1= HistoryDealGetInteger (deal1_ticket, DEAL_POSITION_ID );
   Print ( __FUNCTION__ + ": ticket=" ,deal1_ticket, ", position ID=" ,pos_id1);
   if (! HistoryDealSelect (deal2_ticket))
       Print ( __FUNCTION__ + ": deal 2 not selected. Error=" , GetLastError ());
   pos_id2= HistoryDealGetInteger (deal2_ticket, DEAL_POSITION_ID );
   Print ( __FUNCTION__ + ": ticket=" ,deal2_ticket, ", position ID=" ,pos_id2);
   if (! HistoryDealSelect (deal3_ticket))
       Print ( __FUNCTION__ + ": deal 3 not selected. Error=" , GetLastError ());
   pos_id3= HistoryDealGetInteger (deal3_ticket, DEAL_POSITION_ID );
   Print ( __FUNCTION__ + ": ticket=" ,deal3_ticket, ", position ID=" ,pos_id3);

Deal2_ticket giriş/çıkış fırsatı bileti olduğunda, Deal1_ticket giriş/çıkış fırsatından önceki bilet, Deal3_ticket ise giriş/çıkış fırsatından sonraki bilettir. Her üç durumda da aynı Konum Kimliğini alıyorum.

 
igorbel :

Böyle yazılmış, ama gerçekte hiçbir şey değişmiyor.

İsterseniz, kodum:

Deal2_ticket giriş/çıkış fırsatı bileti olduğunda, Deal1_ticket giriş/çıkış fırsatından önceki bilet, Deal3_ticket ise giriş/çıkış fırsatından sonraki bilettir. Her üç durumda da aynı Konum Kimliğini alıyorum.

Değişiyorum. En son yapı 1340'ta deneyin.
 
igorbel :
Ve bir giriş/çıkış anlaşması ile önceki pozisyonu hangi hacmin kapattığını ve neyin yeni bir pozisyon açtığını nasıl belirleyebilirsiniz?

Bu Uzman Danışmanı bir netleştirme hesabında "Geçmişte hata ayıklama" modunda çalıştırın. Örnek, ticaret geçmişinde yalnızca bir "GİRİŞ/ÇIKIŞ" tipi ticaret olduğu hesaplandığından biraz kabadır.

 //+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#include <Trade\Trade.mqh>
CTrade my_trade;
long deal_positions_id_in_out= 0 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

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

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   static int t= 0 ;
   if (t== 20 )
     {
      my_trade.Buy( 0.02 );
     }
   if (t== 25 )
     {
      my_trade.Buy( 0.01 );
     }
   if (t== 30 )
     {
      my_trade.Sell( 0.07 );
     }
   if (t== 40 )
     {
      my_trade.PositionClose( Symbol ());
     }
   if (t== 50 )
     {
       //--- request trade history 
       HistorySelect ( 0 , TimeCurrent ());
       long      deal_positions_id= 0 ;
       double    deal_volume= 0 ;
       long      deal_entry= 0 ;
       long      deal_type= 0 ;
       ulong     ticket= 0 ;
       for ( int i= 0 ;i< HistoryDealsTotal ();i++)
        {
         if ((ticket= HistoryDealGetTicket (i))> 0 )
           {
            deal_positions_id= HistoryDealGetInteger (ticket, DEAL_POSITION_ID );
            deal_volume= HistoryDealGetDouble (ticket, DEAL_VOLUME );
            deal_entry= HistoryDealGetInteger (ticket, DEAL_ENTRY );
            deal_type= HistoryDealGetInteger (ticket, DEAL_TYPE );
             if (deal_entry== DEAL_ENTRY_INOUT )
               deal_positions_id_in_out=deal_positions_id;
             Print ( "DEAL_POSITION_ID " ,deal_positions_id,
                   ", DEAL_VOLUME " , DoubleToString (deal_volume, 2 ),
                   ", DEAL_ENTRY " , EnumToString (( ENUM_DEAL_ENTRY )deal_entry),
                   ", DEAL_TYPE " , EnumToString (( ENUM_DEAL_TYPE )deal_type));
           }
        }
     }
   if (t== 55 )
     {
       //--- request trade history 
       HistorySelect ( 0 , TimeCurrent ());
       long      deal_positions_id= 0 ;
       double    deal_volume= 0 ;
       long      deal_entry= 0 ;
       long      deal_type= 0 ;
       ulong     ticket= 0 ;
       double    volume_in= 0 ;
       double    volume_out= 0 ;
       for ( int i= 0 ;i< HistoryDealsTotal ();i++)
        {
         if ((ticket= HistoryDealGetTicket (i))> 0 )
           {
            deal_positions_id= HistoryDealGetInteger (ticket, DEAL_POSITION_ID );
            deal_volume= HistoryDealGetDouble (ticket, DEAL_VOLUME );
            deal_entry= HistoryDealGetInteger (ticket, DEAL_ENTRY );
            deal_type= HistoryDealGetInteger (ticket, DEAL_TYPE );
             if (deal_positions_id==deal_positions_id_in_out && deal_entry== DEAL_ENTRY_IN )
               volume_in+=deal_volume;
             else if (deal_positions_id==deal_positions_id_in_out && deal_entry== DEAL_ENTRY_INOUT )
               volume_out=deal_volume;
           }
        }
       Print ( "DEAL_POSITION_ID " ,deal_positions_id_in_out,
             ": volume in " , DoubleToString (volume_in, 2 ), ", volume out " , DoubleToString (volume_out, 2 ));
     }
   t++;
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade ()
  {
//---

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

İlk olarak, tamamlanan tüm işlemler ve pozisyon tamamen kapatıldıktan sonra, tüm işlemlerin açıklamaları ( DEAL_POSITION_ID , DEAL_VOLUME, DEAL_ENTRY,DEAL_TYPE ) görüntülenir, DEAL_POSITION_ID ise IN/OUT tipi bir anlaşma için hatırlanır.

Sonra tekrar geçmişi gözden geçirin ve DEAL_POSITION_ID ile yapılan anlaşmalar için tüm girişleri toplayın.

Bunun gibi bir şey elde ederiz:

 10 : 58 : 23.963     Test (EURUSD,H1)         2016.01 . 04 00 : 06 : 42    CTrade:: OrderSend : instant buy 0.04 EURUSD at 1.08732 [done at 1.08732 ]
10 : 58 : 30.692     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 10    DEAL_POSITION_ID 0 , DEAL_VOLUME 0.00 , DEAL_ENTRY DEAL_ENTRY_IN , DEAL_TYPE DEAL_TYPE_BALANCE
10 : 58 : 30.784     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 10    DEAL_POSITION_ID 2 , DEAL_VOLUME 0.02 , DEAL_ENTRY DEAL_ENTRY_IN , DEAL_TYPE DEAL_TYPE_BUY
10 : 58 : 32.074     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 10    DEAL_POSITION_ID 2 , DEAL_VOLUME 0.01 , DEAL_ENTRY DEAL_ENTRY_IN , DEAL_TYPE DEAL_TYPE_BUY
10 : 58 : 33.826     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 10    DEAL_POSITION_ID 2 , DEAL_VOLUME 0.07 , DEAL_ENTRY DEAL_ENTRY_INOUT , DEAL_TYPE DEAL_TYPE_SELL
10 : 58 : 37.237     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 10    DEAL_POSITION_ID 4 , DEAL_VOLUME 0.04 , DEAL_ENTRY DEAL_ENTRY_OUT , DEAL_TYPE DEAL_TYPE_BUY
10 : 59 : 07.397     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 19    DEAL_POSITION_ID 2 : volume in 0.03 , volume out 0.07
Dosyalar:
Test.mq5  5 kb
 
Andrey Barinov :
Değişiyorum. En son yapı 1340'ta deneyin.
üzerinde denedim. Ülkenizde hangi pazar değişiyor?