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

 

Selamlar. Yetkili bir video izledim "MQL4'ten MQL5'e - Metatrader 5 için Uzman Danışman nasıl yeniden yazılır".
Yazara büyük saygılar. Kendim denemeye karar verdim. yazdı. Fikir şu:
1. Girişlerde dtriger = 1 ayarladım - Buy açılır.
2. Girişlerde dtriger = -1 ayarladım - Satış açılır.
3. Girişlerde dtriger = 0 olarak ayarladım - tüm açık olanlar kapalı.
MT5'te zıt konumlarda tutmanın mümkün olmadığını yardım sayfalarında okudum,
ve bende onlara sahibim.
Soru: mevcut pozisyonun kapanması ne zaman doğru bir şekilde kaydedilir?
sayacın açılması (ters).
Çok teşekkürler.

 #include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo   o_position;
CTrade        o_trade;
CSymbolInfo        o_symbol;
COrderInfo         o_order;

input int           triger            = 0 ;
input double     StartLot             = 0.01 ;
input double     lpos_volume       = 1.0 ;
input int           Step         = 10 ;
input int           MagicNumber    = 12345 ;       //      Magic   nuaber
input int           Slippage          = 30 ;         //   slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name( Symbol ()))
     return ( INIT_FAILED );
   
   RefreshRates();
   
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK ))
   { 
      o_trade.SetTypeFilling( ORDER_FILLING_FOK );
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC ))
   { 
      o_trade.SetTypeFilling( ORDER_FILLING_IOC );
   }
   else 
   {
      o_trade.SetTypeFilling( ORDER_FILLING_RETURN );
   }
      o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol. Digits () == 3 || o_symbol. Digits () == 5 )
   {
      dStep = 10 ;
   }
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
       datetime               lpos_time          =         0 ;
       double                 lpos_price_open    =         0.0 ;
       ENUM_POSITION_TYPE    lpos_type           =        - 1 ;
       int                       pos_count               =         0 ;
       double                 sum_profit         = 0 ;
 
   for ( int i = PositionsTotal () - 1 ; i>= 0 ; i--)
   {
       if (o_position.SelectByIndex(i))
      {
         if (o_position. Symbol () == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
             if (o_position.Time() > lpos_time)
            {  
               lpos_time       = o_position.Time();             //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             }  
            
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }     
       }     
    }          

   // Считаем кол-во отложенных ордеров
   int stop_count= 0 ;

   for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--) 
   {
       if (o_order.SelectByIndex(i)) 
      {
         if (o_order. Symbol () == o_symbol.Name() && o_order.Magic() == MagicNumber) 
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
     
   if (dtriger == 0 )
   {
      CloseAll();
       return ;               
   } 
   
   // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0   && stop_count == 0     )
   {
       if ( dtriger == - 1 &&  lpos_type != POSITION_TYPE_SELL )
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   11111
      }
      
       if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                          

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count> 0 )
   {
       if (lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == - 1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

       if (lpos_type== POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if (pos_count> 0 && stop_count> 0 ) 
     DeleteStopOrders() ;
  
} 
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return ( false ) ;
     
     if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0 )
       return ( false );
      
     return ( true );
}  
//---  --------------------------------------------------------- 
 bool IsFillingTypeAllowed ( string symbol, int fill_type)
{ 
   int filling = ( int ) SymbolInfoInteger (symbol, SYMBOL_FILLING_MODE ); 
 
   return ((filling && fill_type) == fill_type) ;
} 
 
 //  -------------------------------------------------- 
   void CloseAll()
{
   for ( int index = PositionsTotal ()- 1 ; index >= 0 ; index--)
   {
       if (o_position.SelectByIndex(index))
      {
         if (o_position. Symbol () == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }  
    } 
 } 
  
 //----------------------------------------------------------- 
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
     for ( int i = OrdersTotal () - 1 ; i >= 0 ; i-- ) 
   {
       if (o_order.SelectByIndex(i))
         if (o_order. Symbol () == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 } 
 
//+------------------------------------------------------------------+
 
procom :

Selamlar. Yetkili bir video izledim "MQL4'ten MQL5'e - Metatrader 5 için Uzman Danışman nasıl yeniden yazılır".
Yazara büyük saygılar. Kendim denemeye karar verdim. yazdı. Fikir şu:
1. Girişlerde dtriger = 1 ayarladım - Buy açılır.
2. Girişlerde dtriger = -1 ayarladım - Satış açılır.
3. Girişlerde dtriger = 0 olarak ayarladım - tüm açık olanlar kapalı.
MT5'te zıt pozisyonları tutmanın mümkün olmadığını yardım sayfalarında okudum,
ve bende onlara sahibim.
Soru: mevcut pozisyonun kapanışı ne zaman doğru bir şekilde kaydedilir?
sayacın açılması (ters).
Çok teşekkürler.

Kılavuzu çok dikkatli okumamışsınız anlaşılan.

Referans: Genel İlkeler - Alım Satım İşlemleri .

Alt satır: MetaTrader 5, hem Netleştirme sistemine hem de Riskten Korunma sistemine sahiptir.

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 

Ve görevinizi farklı bir şekilde formüle ederdim:

1. dtriger = 1 - Satın Al'ı açar.
2. dtriger = -1 - Satış açılır.
3. dtriger = 0 - tüm açık olanlar kapalı.

Ve danışman bunu yapmalıdır:

  • ALIŞ açmanız gerekiyorsa - o zaman önce SATIŞ'ı kapatmanız gerekir (SAT pozisyonlarını kapatmak için bir komut verin - var olup olmaması önemli değildir)
  • Bir SATIŞ açmanız gerekiyorsa, önce ALIŞ pozisyonunu kapatmanız gerekir (ALIŞ pozisyonlarını kapatmak için bir komut verin - var olup olmaması önemli değildir)
  • her şeyi kapatmanız gerekiyorsa, o zaman her şeyi kapatın (alıp satmamaları önemli değil)

Uygulama için iki algoritmaya ihtiyaç vardır (burada benzersiz bir tanımlayıcı da vardır - sihirli sayı) - ayrıca kapatılabilir.

 //+------------------------------------------------------------------+
//| Close positions                                                  |
//+------------------------------------------------------------------+
void ClosePositions( const ENUM_POSITION_TYPE pos_type)
  {
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of current positions
       if (m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==InpMagic)
             if (m_position.PositionType()==pos_type) // gets the position type
               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }

ve

 //+------------------------------------------------------------------+
//| Close all positions                                              |
//+------------------------------------------------------------------+
void CloseAllPositions( void )
  {
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of current positions
       if (m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==InpMagic)
            m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }


Genel anlamı, PositionsTotal() -1'den 0'a bir döngüdeki tüm pozisyonları atlamaktır. Yani, PositionsTotal()-1'den sıfıra ve sıfırdan PositionsTotal()-1'e değil. Bu önemli.

 
Ayrıca başka bir ipucu: MetaTrader 5'te çalışırken, bir sipariş BEKLEMEDEKİ SİPARİŞ'tir . Bu nedenle, ilk aşamada, düşüncelerinizde kafa karışıklığı yaratmamak için "Sipariş" kelimesini bile hatırlamamanız şiddetle tavsiye edilir.
 
Vladimir Karputov :
Ayrıca başka bir ipucu: MetaTrader 5'te çalışırken, bir sipariş BEKLEMEDEKİ SİPARİŞ'tir . Bu nedenle, ilk aşamada, düşüncelerinizde kafa karışıklığı yaratmamak için "Sipariş" kelimesini bile hatırlamamanız şiddetle tavsiye edilir.

Ayrıca Al ve Sat piyasa emirlerinin yanı sıra CloseBy kapanış emri de vardır.

 

Çok teşekkürler, saat gibi.

 
procom :

Çok teşekkürler, saat gibi.

Kodlarım için bir açıklamaya ihtiyacınız varsa - sorun.
 

O zaman çok nazik ol.
Boşluk eklendi ve bir ön kapanış öngördü, ancak yine siparişler burada ve orada asılı duruyor.

 // +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count> 0 )
   {
       if (lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == - 1 )
         {
         o_trade.PositionClose(o_symbol.Name());
         }
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

       if (lpos_type== POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.PositionClose(o_symbol.Name());
         }
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }
 
procom :

O zaman çok nazik ol.
Boşluk eklendi ve bir ön kapanış öngördü, ancak yine siparişler burada ve orada asılı duruyor.

Kapatma ve açma işlemlerinin ayrılması gerekir - yani bu işlemleri yığın üzerinde yapmayın.
Örnek plan: OnTick()'te, en başta üç bayrak kontrol edilir: ExtNeedCloseBuy, ExtNeedCloseSell ve ExtNeedCloseAll.
Ve ancak o zaman iki bayrağı kontrol ederiz: ExtNeedOpenBuy ve ExtNeedOpenSell.
Böylece, her şey katı bir sırayla gidecek.
Ve evet, emir yok: açık pozisyonlar var.
 
procom :

Çok teşekkürler, saat gibi.

Açılış sinyali nedir? Aksi takdirde, sonuç tam bir kod değildir - sadece pozisyonları kapatır ve pozisyonları da açmanız gerekir...


ticaret komutu.mq5
#özellik sürümü "1.000"

Şimdiye kadar sadece üç şey yapar:

  • Tüm Satın Alları Kapat
  • Tüm Satışları Kapat
  • Tüm Alış ve Satışları Kapatın
Kâr Al, Zararı Durdur ve Takip Etme zaten yerleşiktir. Eksik olan tek şey, açılış pozisyonları için sinyallerin açıklamasıdır.
Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Dosyalar: