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

 

Tünaydın!

Burada FORTS vadeli işlem piyasasında öneriler, hatalar, özellikler ve sık kullanılan işlevler yayınlayacağım.

ÖNEMLİ: Konuyu "uzatmamak" için herhangi bir yorum varsa,

veya sorularınız varsa - bu bölümde ayrı bir konu oluşturun (burada cevaplamayacağım).

Tavsiye :

MQL5 standart kitaplığı FOREX piyasası için "keskinleştirilmiştir", dolayısıyla

FORTS için uzmanların gelişmeleri Her şeyi kendiniz yazmanızı tavsiye ederim.

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

Aracının sunucusunun ticaret parametrelerini kontrol etme işlevi.

Bu fonksiyonda, şu parametreleri kontrol etmek gereklidir:

Danışmanınızda kullanacaksınız. İşte bir örnek:

(YALNIZCA OnInit() içinde kullanın)

 //+------------------------------------------------------------------+
//| Expert Check Market Parameters function                          |
//+------------------------------------------------------------------+
bool CheckMarketParam( const string a_symbol )
{
//--- Check for full mode
   ENUM_SYMBOL_TRADE_MODE trade_mode = ENUM_SYMBOL_TRADE_MODE ( SymbolInfoInteger ( a_symbol, SYMBOL_TRADE_MODE ) );
  
   if ( trade_mode != SYMBOL_TRADE_MODE_FULL )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает полную торговлю!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }
//--- Check trade execution mode
   ENUM_SYMBOL_TRADE_EXECUTION market_info = ENUM_SYMBOL_TRADE_EXECUTION ( SymbolInfoInteger ( a_symbol, SYMBOL_TRADE_EXEMODE ) );
    
   if ( market_info != SYMBOL_TRADE_EXECUTION_EXCHANGE )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает TRADE EXECUTION EXCHANGE режим!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }
//--- Check orders mode
   int order_mode = int ( SymbolInfoInteger ( a_symbol, SYMBOL_ORDER_MODE ) );
  
   if ( ( SYMBOL_ORDER_MARKET & order_mode )!= SYMBOL_ORDER_MARKET )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает Market Execution режим установки ордеров!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }
  
   if ( ( SYMBOL_ORDER_LIMIT & order_mode )!= SYMBOL_ORDER_LIMIT )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает Limit режим установки ордеров!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }
  
   if ( ( SYMBOL_ORDER_STOP_LIMIT & order_mode ) != SYMBOL_ORDER_STOP_LIMIT )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает Stop Limit режим установки ордеров!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }
  
   if ( ( SYMBOL_ORDER_STOP & order_mode )!= SYMBOL_ORDER_STOP )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает Stop режим установки ордеров!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }
  
   if ( ( SYMBOL_ORDER_SL & order_mode) != SYMBOL_ORDER_SL )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает Stop Loss режим установки ордеров!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }
  
   if ( ( SYMBOL_ORDER_TP & order_mode) != SYMBOL_ORDER_TP )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает Take Profit режим установки ордеров!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }
//---Filing mode
   int filling_mode = int ( SymbolInfoInteger ( a_symbol, SYMBOL_FILLING_MODE ) );
  
   if ( ( SYMBOL_FILLING_IOC & filling_mode ) != SYMBOL_FILLING_IOC )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает filling IOC режим исполнения ордеров!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }
  
   if ( ( SYMBOL_FILLING_FOK & filling_mode ) != SYMBOL_FILLING_FOK )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает filling FOK режим исполнения ордеров!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }      
//---Ckeck expiration
   int symbol_exp_type = int ( SymbolInfoInteger ( a_symbol, SYMBOL_EXPIRATION_MODE ) );
//---  
   if ( ( symbol_exp_type & SYMBOL_EXPIRATION_DAY ) != SYMBOL_EXPIRATION_DAY )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает экспирацию DAY!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }
   if ( ( symbol_exp_type & SYMBOL_EXPIRATION_SPECIFIED_DAY ) != SYMBOL_EXPIRATION_SPECIFIED_DAY )
  {
     MessageBox ( "Символ " + a_symbol + " не поддерживает экспирацию SPECIFIED DAY!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( false );
  }
   return ( true );
} 

Kullanım örneği:

 int OnInit ()
{
   if ( !CheckMarketParam( _Symbol ) ) return ( INIT_FAILED );
   return ( INIT_SUCCEEDED );
}

Enstrümanın sona ermesine kalan gün sayısını alma:

 #define YEAR           365

int GetExpiration( const string aSymbol )
{
   MqlDateTime ExpData, CurData;
    
   datetime exp_time = datetime ( SymbolInfoInteger ( aSymbol, SYMBOL_EXPIRATION_TIME ) );
      
   TimeToStruct ( exp_time, ExpData );
   TimeTradeServer ( CurData );
      
   if ( ExpData.year != CurData.year )
  {
     return ( YEAR * ( ExpData.year - CurData.year ) - CurData.day_of_year + ExpData.day_of_year );
  }
   else
  {
     return ( ExpData.day_of_year - CurData.day_of_year );
  }
}

Takaslar hariç "net" pozisyon fiyatının alınması:

 //+------------------------------------------------------------------+
//| Expert Get position price function                               |
//+------------------------------------------------------------------+
double GetPositionPrice( const string aSymbol )
{
   double price_in = 0 ;
   double volume_in = 0 ;
   double price_out = 0 ;
   double volume_out = 0 ;
   double price = 0 ;
   double volume = 0 ;
  
   if ( PositionSelect ( aSymbol ) )
  {
     ulong pos_id = ulong ( PositionGetInteger ( POSITION_IDENTIFIER ) );
    
     if ( pos_id > 0 )
    {
       if ( HistorySelectByPosition ( pos_id ) )
      {
         int deals = HistoryDealsTotal ();
      
         for ( int i = 0 ; i < deals; i++ )
        {
           ulong deal_ticket = HistoryDealGetTicket ( i );
           ulong order_ticket = ulong ( HistoryDealGetInteger ( deal_ticket, DEAL_ORDER ) );
        
           if ( order_ticket > 0 )
          {
             ENUM_DEAL_ENTRY deal_entry = ENUM_DEAL_ENTRY ( HistoryDealGetInteger ( deal_ticket, DEAL_ENTRY ) );
              
             if ( deal_entry == DEAL_ENTRY_IN )
            {
              price = HistoryDealGetDouble ( deal_ticket, DEAL_PRICE );
              volume = HistoryDealGetDouble ( deal_ticket, DEAL_VOLUME );
                                
              price_in += price * volume;
              volume_in += volume;  
            }
             else
             if ( deal_entry == DEAL_ENTRY_OUT )
            {
              price = HistoryDealGetDouble ( deal_ticket, DEAL_PRICE );
              volume = HistoryDealGetDouble ( deal_ticket, DEAL_VOLUME );
                                
              price_out += price * volume;
              volume_out += volume;  
            }
          }
        }
         if ( volume_out > 0 )
        {
           if ( volume_in > 0 ) { price_in = price_in / volume_in; } else return ( 0 );
          price_out = price_out / volume_out;
          price = ( price_in - price_out ) * ( volume_in - volume_out );
        }
         else
        {
           if ( volume_in > 0 ) { price = price_in / volume_in; } else return ( 0 );
        }
         return ( NormalizeDouble ( price, _Digits ) );
      }
       else
      {
         Print ( "GetPositionPrice: Невозможно получить историю позиции по символу " , aSymbol );
      }
    }
     else
    {
       Print ( "GetPositionPrice: Невозможно определить идентификатор позиции по символу " , aSymbol );
    }
  }
   return ( 0 );
} 

İşlemleri saymak için global bir terminal değişkeni oluşturma:

(YALNIZCA OnInit() içinde kullanın)

   if ( ! GlobalVariableCheck ( "trans_count" ) )
  {
     datetime a_time = GlobalVariableSet ( "trans_count" , 0 );
    
     if ( ulong ( a_time ) == 0 )
    {
       MessageBox ( "Глобальная переменная терминала 'Счётчик транзакций' не создана!" , "Ошибка" , MB_OK | MB_ICONHAND );
       return ( INIT_FAILED );
    }
  }

Terminalin global değişkenine korumalı yazma (işlem sayacı):

 //+------------------------------------------------------------------+
//| Expert Set transaction count function                            |
//+------------------------------------------------------------------+
void SetTransCount( const bool up_down )
{
   double tr_count;
   uint i = 0 ;
   do
  {
    i++;
     if ( GlobalVariableGet ( "trans_count" , tr_count ) )
    {
       if ( up_down )
      {
         if ( GlobalVariableSetOnCondition ( "trans_count" , tr_count + 1 , tr_count ) )
        {
          i = 100 ;
        }
      }
       else
      {
         if ( GlobalVariableSetOnCondition ( "trans_count" , tr_count - 1 , tr_count ) )
        {
          i = 100 ;
        }
      }
    }
  }  
   while ( i < 100 );
}

up_down parametresi true ise, terminalin global değişkenini arttırırız,

ve tersi.

Para sıkıntısı durumunda, hacmin otomatik olarak azaltılmasıyla nakit kontrolü:

 //| Expert Check money function                                      |
//+------------------------------------------------------------------+ 
bool CheckMoney( long &volume )
{
   if ( volume <= 0 ) return ( false );
//---
   double symbol_go = SymbolInfoDouble ( _Symbol , SYMBOL_MARGIN_INITIAL );
   double free_margin = ( AccountInfoDouble ( ACCOUNT_FREEMARGIN ) / 100 ) * 90 ; //90% от свободных средств
   double real_go = NormalizeDouble ( symbol_go * volume, 2 );
//---     
   if ( real_go <= free_margin )
  {
     return ( true );
  }
   else
  {
     while ( real_go > free_margin )
    {
      volume--;
      
       if ( volume <= 0 )
      {
         Print ( "CheckMoney: Не хватает средств!" );
         return ( false );
      }  
      real_go = NormalizeDouble ( symbol_go * volume, 2 );
    }
     return ( true );
  }
   Print ( "CheckMoney: Не хватает средств!" ); 
   return ( false );
}

OrderSend() komutu ile piyasa/limit emri verilmesi

eğer fiyat = ''0" - piyasa emri:

 //+------------------------------------------------------------------+
//| Expert set order function                                        |
//+------------------------------------------------------------------+
void SetOrder( const string aSymbol, ulong &ticket, const double price, const double volume, const bool buy_sell )
{
   MqlTradeRequest request = { 0 };
   MqlTradeResult   result  = { 0 };
  ticket = 0 ;
   
//--- Fill structure
  request.magic = 1234567890 ;
  request.symbol = aSymbol;
  request.volume = volume; 
  request.type_filling = ORDER_FILLING_IOC ;
  request.type_time = ORDER_TIME_DAY ;
    
   if ( price == 0 )
  {
    request.action = TRADE_ACTION_DEAL ;
    request.comment = "Рыночный ордер..." ;
//---    
     if ( buy_sell )
    {
      request.type = ORDER_TYPE_BUY ;
    }
     else
    {
      request.type = ORDER_TYPE_SELL ;
    }
  }
   else
  { 
    request.action = TRADE_ACTION_PENDING ;
    request.price = price;
    request.comment = "Лимитный ордер..." ;
//---    
     if (buy_sell)
    {
      request.type = ORDER_TYPE_BUY_LIMIT ;
    }
     else
    {
      request.type = ORDER_TYPE_SELL_LIMIT ;
    }   
  }  
//--- Send order
   if ( OrderSend ( request, result ) )
  {
     if ( result.retcode == TRADE_RETCODE_PLACED ) 
    {
      ticket = result.order;
    }
     else
    {
       Print ( "SeOrder: Установка ордера не выполнена! " , aSymbol );
    }
  }
   else
  {
     Print ( "SeOrder: Ордер не отправлен! " , aSymbol );
  }
}

OrderSend() komutu ile sipariş silme

 void RemoveOrder( ulong & ord_ticket )
{
   if ( ord_ticket >   0 )
  {
     if ( OrderSelect ( ord_ticket ) )
    {
       MqlTradeRequest request = { 0 };
       MqlTradeResult   result  = { 0 };
//---  
      request.action = TRADE_ACTION_REMOVE ;
      request.order  = ord_ticket;
//---  
       if ( OrderSend ( request, result ) )
      {
         if ( result.retcode == TRADE_RETCODE_PLACED )
        { 
          ord_ticket = result.order;
        }
         else
        {
           Print ( "RemoveOrder: Удаление старого ордера не выполнено! Билет = " , ord_ticket );
        }  
      }
       else
      {
         Print ( "RemoveOrder: Ордер не отослан! Билет = " , ord_ticket );
      }
    }
  }
}

OrderSend() komutuyla bekleyen bir sipariş vermek

 //+------------------------------------------------------------------+
//| Place order                                                      |
//+------------------------------------------------------------------+
void PlaceOrder( const string aSymbol, ulong & ticket, const double price, const double volume, const bool buy_sell )
{
   MqlTradeRequest request = { 0 };
   MqlTradeResult   result  = { 0 };
  ticket = 0 ;
     
//--- Fill structure
  request.action = TRADE_ACTION_PENDING ;
  request.magic  = 1234567890 ;
  request.symbol = aSymbol;
  request.volume = volume;
  request.price  = price;
    
   if ( buy_sell )
  {
    request.type = ORDER_TYPE_BUY_LIMIT ;
  }
   else
  {
    request.type = ORDER_TYPE_SELL_LIMIT ;
  } 
  request.comment = "Отложенный ордер..." ;      
  request.type_filling = ORDER_FILLING_RETURN ;
  request.type_time = ORDER_TIME_DAY ;
  
//--- Send order
   if ( OrderSend ( request, result ) )
  {
     if ( result.retcode == TRADE_RETCODE_PLACED ) 
    {
      ticket = result.order;
    }
     else
    {
       Print ( "PlaceOrder: Ордер не установлен!" );
    }
  }
   else
  {
     Print ( "PlaceOrder: Ордер не отослан! " );
  }
}

OrderSend() komutuyla bekleyen bir emri değiştirme

 //+------------------------------------------------------------------+
// Modify order                                                      |
//+------------------------------------------------------------------+
void ModifyOrder( const string aSymbol, const double price, ulong & ticket )
{
   if ( ticket > 0 )
  {
     if ( OrderSelect ( ticket ) )
    {
       MqlTradeRequest request = { 0 };
       MqlTradeResult   result  = { 0 };
   
      request.action = TRADE_ACTION_MODIFY ;
      request.symbol = aSymbol;
      request.order  = ticket;
      request.price  = price;
      request.type_time = ORDER_TIME_DAY ;
  
       if ( OrderSend ( request, result ) )
      {
         if ( result.retcode == TRADE_RETCODE_PLACED ) 
        {
          ticket = result.order;
        }
         else
        {
           Print ( "ModifyOrder: Ордер не модифицирован! Билет = " , ticket );
        }
      }
       else
      {
         Print ( "ModifyOrder: Ордер не отослан! Билет " , ticket );
      }
    }
  }
}

OrderSendAsync() komutuyla bekleyen bir sipariş ayarlama

Bu komutu kullanırken, bunun sonucunda bilet elde edilmez.

işlevler, ancak OnTradeTransaction() işlevinde. OrderSendAsync() işlevinde,

sipariş verme talebinin numarasını alın:

uint req_id;
 ulong order_ticket = 0;
 void PlaceAsync( const string a_symbol, uint & req_id, const double price, const double volume, const bool buy_sell )
{
   MqlTradeRequest request = { 0 };
   MqlTradeResult   result  = { 0 };
  req_id = 0 ;
     
//--- Fill structure
  request.action = TRADE_ACTION_PENDING ;
  request.magic  = 1234567890 ;
  request.symbol = a_symbol;
  request.volume = volume;
  request.price  = price;
    
   if ( buy_sell )
  {
    request.type = ORDER_TYPE_BUY_LIMIT ;
  }
   else
  {
    request.type = ORDER_TYPE_SELL_LIMIT ;
  } 
  request.comment = "Отложенный ордер..." ;      
  request.type_filling = ORDER_FILLING_RETURN ;
  request.type_time = ORDER_TIME_DAY ;
  
//--- Send order
   if ( OrderSendAsync ( request, result ) )
  {
     if ( result.retcode == TRADE_RETCODE_PLACED ) 
    {
      req_id = result.request_id;
    }
     else
    {
       Print ( "PlaceAsync: Ордер не установлен! " , a_symbol );
    }
  }
   else
  {
     Print ( "PlaceAsync: Ордер на отослан! " , a_symbol );
  }
}

Talep numarasına göre bilet alma:

 void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result )
{
   switch ( trans.type )
  {
     case TRADE_TRANSACTION_REQUEST : if ( trans.order_state == ORDER_STATE_STARTED )
                                    {
                                       if ( ( req_id != 0 ) && ( result.request_id == req_id ) )
                                      {
                                         if ( result.retcode == TRADE_RETCODE_PLACED )
                                        {
                                           if ( result.order > 0 )
                                          {
                                            order_ticket = result.order;
                                          }
                                           else
                                          {
                                             Print ( "OnTradeTransaction: Не получен билет! Запрос = " , req_id );
                                          }
                                        }
                                      }
                                    }  
                                     break ;
                                    
  }
}

OrderSend() ve OrderSendAsync() işlevlerinin hataları (dönüş kodları) işleme

CheckError() işlevi, sipariş gönderme uygulamasına eklenir.Örnek:

 void ModifyOrder( const string aSymbol, const double price, ulong & ticket )
{
   if ( ticket > 0 )
  {
     if ( OrderSelect ( ticket ) )
    {
       MqlTradeRequest request = { 0 };
       MqlTradeResult   result  = { 0 };
   
      request.action = TRADE_ACTION_MODIFY ;
      request.symbol = aSymbol;
      request.order  = ticket;
      request.price  = price;
      request.type_time = ORDER_TIME_DAY ;
  
       if ( OrderSend ( request, result ) )
      {
         if ( result.retcode == TRADE_RETCODE_PLACED ) 
        {
          ticket = result.order;
        }
         else
        {
          CheckError( result.retcode, "ModifyOrder: Ордер не модифицирован! Билет = " , ticket );
        }
      }
       else
      {
        CheckError( result.retcode, "ModifyOrder: Ордер не отослан! Билет " , ticket );
      }
    }
  }
}

CheckError() işlevinin kendisi ( örnekteki tüm dönüş kodları değil )

 void CheckError( const uint ret_code, const string err_msg, const ulong a_ticket )
{
   switch ( ret_code )
  {
     case TRADE_RETCODE_TRADE_DISABLED :
                                           break ;
     case TRADE_RETCODE_MARKET_CLOSED :
                                           break ;
     case TRADE_RETCODE_NO_MONEY :
                                           break ; 
     case TRADE_RETCODE_PRICE_OFF :
                                           break ;   
     case TRADE_RETCODE_TOO_MANY_REQUESTS :
                                           break ;
     case TRADE_RETCODE_SERVER_DISABLES_AT : 
                                           break ;
     case TRADE_RETCODE_CLIENT_DISABLES_AT : 
                                           break ;
     case TRADE_RETCODE_INVALID_PRICE :      
                                           break ;
     case TRADE_RETCODE_INVALID :
                                           break ;                                                       
                
     default : Print ( err_msg, GetRetCode( ret_code ), "; Билет = " , a_ticket );  
             break ;            
  }
}

Devamına bakın


özellikler:

ORDER_FILLING_IOC yürütme ile LIMIT sipariş içeren BİR'den fazla sözleşme satın alırken,

sipariş ilk cilt ile doldurulursa, geçmişteki bir sipariş ORDER_STATE_CANCELED olarak saklanabilir,

ve ikincisi başarısız oldu.

Misal:

ORDER_FILLING_IOC yürütme ile LIMIT siparişle 3 sözleşme satın almak,

aşağıdaki durum var:

1. Her üç sözleşmeyi de satın alırsak, geçmişteki sipariş durumu = ORDER_STATE_FILLED olur

2. Hiçbir şey satın almadıysak, geçmiş durumda = ORDER_STATE_CANCELED

3. İlk iki sözleşmeyi (28449) satın aldıysak, ancak 1 sözleşme (28450) almadıysak, o zaman tarihteki durum = ORDER_STATE_CANCELED

4. İlk iki sözleşmeyi (28449) satın almadıysak, ancak 1 (28450) satın aldıysak, o zaman geçmiş durumda = ORDER_STATE_PARTIAL

======= Örneğin sonu ====================

Verimsiz işlemlerin sayısı (verimsiz bir işlem, bir işleme yol açmayan bir işlemdir.

FORTS vadeli işlem piyasasında bir emrin yerleştirilmesi, değiştirilmesi ve silinmesi) tam işlem seansı başına 2000 ile sınırlıdır

geçerli günün 19-00'ından ertesi günün 18-45'ine kadar. Aşan için - Borsa para cezası

http://moex.com/n8725

Hatalar:

1. Aracının MT5 sunucusunda veya borsada bir arıza meydana gelirse, komut

sil(değiştir) MEVCUT sipariş sunucusu döndürür:

hata 10013 = TRADE_RETCODE_INVALID = Geçersiz istek ( Geçersiz istek )

2. Bazen, başarısızlık durumunda, bekleyen veya limitli bir emir vermeye çalışırken bir hata oluşur - " Enstrüman şu anda mevcut değil "

(bu bir yazım hatası değil, mesaj bu)

Belgelerde ticaret sunucusu için iade kodu yok!

 

Ya bazı modlar desteklenmiyorsa? Neden aniden ticaret yapmaktan vazgeçesiniz?

Özellikle "Sipariş vermede Stop Limit modunu desteklemiyorsa"? Bu, ticaret yapmayı imkansız kılan inanılmaz bir talihsizliktir.

© BAŞLARDA YIKIM

 

En başında şöyle diyor:

ÖNEMLİ: Konuyu "uzatmamak" için herhangi bir yorum varsa,

veya sorularınız varsa - bu bölümde ayrı bir konu oluşturun (burada cevaplamayacağım).  

P / S Özellikle "yetenekli" için:

Bu fonksiyonda, şu parametreleri kontrol etmek gereklidir:

Danışmanınızda kullanacaksınız. İşte bir örnek:

......................

 

Devam:

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

CheckError() işlevinin kendisi ( örnekteki tüm dönüş kodları değil )

................................................ . ......................

Dönüş kodlarının açıklaması:

 string GetRetCode( const uint code )
{
   string retcode;
  
   switch ( code )
  {
     case TRADE_RETCODE_REQUOTE : retcode = "Реквота" ;
         break ;
     case TRADE_RETCODE_REJECT : retcode = "Запрос отвергнут" ;
         break ;
     case TRADE_RETCODE_CANCEL : retcode = "Запрос отменен трейдером" ;
         break ;
     case TRADE_RETCODE_PLACED : retcode = "Ордер размещен" ;
         break ;
     case TRADE_RETCODE_DONE : retcode = "Заявка выполнена" ;
         break ;
     case TRADE_RETCODE_DONE_PARTIAL : retcode = "Заявка выполнена частично" ;
         break ;
     case TRADE_RETCODE_ERROR : retcode = "Ошибка обработки запроса" ;
         break ;
     case TRADE_RETCODE_TIMEOUT : retcode = "Запрос отменен по истечению времени" ;
         break ;
     case TRADE_RETCODE_INVALID : retcode = "Неправильный запрос" ;
         break ;
     case TRADE_RETCODE_INVALID_VOLUME : retcode = "Неправильный объем в запросе" ;
         break ;
     case TRADE_RETCODE_INVALID_PRICE : retcode = "Неправильная цена в запросе" ;
         break ;
     case TRADE_RETCODE_INVALID_STOPS : retcode = "Неправильные стопы в запросе" ;
         break ;
     case TRADE_RETCODE_TRADE_DISABLED : retcode = "Торговля запрещена" ;
         break ;
     case TRADE_RETCODE_MARKET_CLOSED : retcode = "Рынок закрыт" ;
         break ;
     case TRADE_RETCODE_NO_MONEY : retcode = "Нет достаточных денежных средств для выполнения запроса" ;
         break ;
     case TRADE_RETCODE_PRICE_CHANGED : retcode = "Цены изменились" ;
         break ;
     case TRADE_RETCODE_PRICE_OFF : retcode = "Отсутствуют котировки для обработки запроса" ;
         break ;
     case TRADE_RETCODE_INVALID_EXPIRATION : retcode = "Неверная дата истечения ордера в запросе" ;
         break ;
     case TRADE_RETCODE_ORDER_CHANGED : retcode = "Состояние ордера изменилось" ;
         break ;
     case TRADE_RETCODE_TOO_MANY_REQUESTS : retcode = "Слишком частые запросы" ;
         break ;
     case TRADE_RETCODE_NO_CHANGES : retcode = "В запросе нет изменений" ;
         break ;
     case TRADE_RETCODE_SERVER_DISABLES_AT : retcode = "Автотрейдинг запрещен сервером" ;
         break ;
     case TRADE_RETCODE_CLIENT_DISABLES_AT : retcode = "Автотрейдинг запрещен клиентским терминалом" ;
         break ;
     case TRADE_RETCODE_LOCKED : retcode = "Запрос заблокирован для обработки" ;
         break ;
     case TRADE_RETCODE_FROZEN : retcode = "Ордер или позиция заморожены" ;
         break ;
     case TRADE_RETCODE_INVALID_FILL : retcode = "Указан неподдерживаемый тип исполнения ордера по остатку" ;
         break ;
     case TRADE_RETCODE_CONNECTION : retcode = "Нет соединения с торговым сервером" ;
         break ;
     case TRADE_RETCODE_ONLY_REAL : retcode = "Операция разрешена только для реальных счетов" ;
         break ;
     case TRADE_RETCODE_LIMIT_ORDERS : retcode = "Достигнут лимит на количество отложенных ордеров" ;
         break ;
     case TRADE_RETCODE_LIMIT_VOLUME : retcode = "Достигнут лимит на объем ордеров и позиций для данного символа" ;
         break ;
     case TRADE_RETCODE_INVALID_ORDER : retcode = "Неверный или запрещённый тип ордера" ;
         break ;
     case TRADE_RETCODE_POSITION_CLOSED : retcode = "Позиция с указанным POSITION_IDENTIFIER уже закрыта" ;
         break ;
     default : retcode = "Нет кода возврата." ;  
         break ; 
  }
   return ( retcode );
}

 

Tavsiye :

FORTS için Expert Advisors tasarlarken Tick olayını kullanmanızı önermem ancak

BookEvent olayını kullanmak daha iyidir

Örnekler:

Bir bardak eklemek:

(YALNIZCA OnInit() içinde kullanın)

   if ( ! MarketBookAdd ( _Symbol ) )
  {
     MessageBox ( "Не добавлен стакан фьючерса " + _Symbol + "!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( INIT_FAILED );
  } 

Bir cam aboneliğini silme:

 void OnDeinit ( const int reason )
{
   MarketBookRelease ( _Symbol );
}

Depth of Market'ten en iyi ASK ve BID'yi ve hacimlerini almak:

 double sell_price, buy_price;
long sell_volume, buy_volume;

//+------------------------------------------------------------------+
//| Expert Get Stakan values function                                |
//+------------------------------------------------------------------+ 
bool GetStakanValues( const string aSymbol, double &sell_price,
                       double &buy_price, long &sell_volume, long &buy_volume )
{
   MqlBookInfo book_price[];
  buy_price  = 0 ;
  sell_price = DBL_MAX ;
  buy_volume = 0 ;
  sell_volume = 0 ;
  
//--- Get stakan
   if ( MarketBookGet ( aSymbol, book_price ) ) //getBook )
  {
     int size = ArraySize ( book_price );
//---    
     if ( size > 0 )
    {
       double a_min_price = SymbolInfoDouble ( aSymbol, SYMBOL_SESSION_PRICE_LIMIT_MIN );
       double a_max_price = SymbolInfoDouble ( aSymbol, SYMBOL_SESSION_PRICE_LIMIT_MAX );
//---     
       for ( int i = 0 ; i < size; i++ )
      {
         if ( book_price[i].type == BOOK_TYPE_SELL )
        {
           if ( book_price[i].price < sell_price )
          {
            sell_price = book_price[i].price;
            sell_volume = book_price[i].volume;  
          }
        }
         else
         if ( book_price[i].type == BOOK_TYPE_BUY ) //First buy - exit
        {
          buy_price = book_price[i].price;
          buy_volume = book_price[i].volume;
           break ;
        }
      }
       if ( ( buy_price <= a_max_price ) && ( buy_price >= a_min_price ) &&
           ( sell_price <= a_max_price ) && ( sell_price >= a_min_price ) )
      {
         if ( sell_price == DBL_MAX ) sell_price = 0 ;
//---        
         if ( ( sell_price > 0 ) && ( buy_price > 0 ) )
        {
           return ( true );
        }  
      }
    }
  }
//---
   if ( sell_price == DBL_MAX ) sell_price = 0 ;
//---   
   return ( false ); 
}

İşlev çağrısı:

if ( a_symbol == _Symbol ) kontrolü ZORUNLUDUR, değişenin Pazar Derinliğiniz olduğunu garanti eder.

 //+------------------------------------------------------------------+
//| Expert On Book event function                                    |
//+------------------------------------------------------------------+  
void OnBookEvent ( const string &a_symbol )
{
   if ( a_symbol == _Symbol )
  {
     if ( GetStakanValues( _Symbol , sell_price, buy_price, sell_volume, buy_volume ) )
    {
       //you code
    }
  }
}
 

TEŞEKKÜR EDERİM!!!)

 

özellikler:

Etkisiz ve hatalı için hesaplama formülleri ve puanlama

ek işlemleri.

P/S Genellikle kurallar ve puanlar değişir :(

Dosyalar:
 

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

SetStDayTime() işlevi, işlem gününün başlangıç saatini (istek anında) döndürür.

GetExgangeFee() işlevi, değişim komisyonunu ve işlem günü başına işlem sayısını (istek anında) döndürür:

 //+------------------------------------------------------------------+
//|                                                       Tr_fee.mq5 |
//|                                          Copyright 2015, Mikalas |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Mikalas"
#property link        "https://www.mql5.com"
#property version    "1.00"
//
input long    TrPoint   = 1 ;               //Балл за транзакцию
input long    DealPoint = 40 ;             //Балл за сделку
//
datetime start_day_time;
//
//+------------------------------------------------------------------+
//| Expert Set start day time function                               |
//+------------------------------------------------------------------+
datetime SetStDayTime()
{
   MqlDateTime   dt_str; 
   TimeTradeServer ( dt_str );
//---
   if ( ( dt_str.day_of_week == 0 ) || ( dt_str.day_of_week == 6 ) ) return ( datetime ( 0 ) );  
//---
   string time_str = IntegerToString ( dt_str.year ) + "." + IntegerToString ( dt_str.mon ) +
                     "." + IntegerToString ( dt_str.day ) + " 19:00:00" ;
   ulong cur_day = ulong ( StringToTime ( time_str ) );                     

   if ( ( dt_str.hour >= 19 ) && ( dt_str.hour <= 23 ) )
  {
     return ( StringToTime ( time_str ) );
  }
   else
  {
     ulong one_day = 24 * 60 * 60 ;
//---      
     if ( dt_str.day_of_week == 1 )
    {
      cur_day -= one_day * 3 ;
    }
     else
    {
      cur_day -= one_day;
    }
     return ( datetime ( cur_day ) );
  }  
   return ( datetime ( 0 ) );
}
//+------------------------------------------------------------------+
//| Expert calc deals fee function                                   |
//+------------------------------------------------------------------+
double GetExgangeFee( const datetime start_time, long & deals )
{
   double all_fee = 0.0 ;
   ulong deal_ticket;
  deals = 0 ;
//---  
   if ( HistorySelect ( start_time, TimeTradeServer () ) )
  {
     int deals_total = HistoryDealsTotal ();
//---   
     if ( deals_total > 0 )
    {
       for ( uint i = 0 ; i < uint ( deals_total ); i++ )
      {
        deal_ticket = HistoryDealGetTicket ( i );
//---        
         if ( deal_ticket > 0 )
        {
           ulong order_ticket = ulong ( HistoryDealGetInteger ( deal_ticket, DEAL_ORDER ) );
          
           if ( order_ticket > 0 )
          {
            deals++;
            all_fee += HistoryDealGetDouble ( deal_ticket, DEAL_COMMISSION );
          }  
        }
      }
       return ( MathAbs ( all_fee ) );
    }  
  }
   return ( 0 );
}
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
   long a_deals;
  start_day_time = SetStDayTime();
//---  
   if ( ulong ( start_day_time ) == 0 )
  {
     MessageBox ( "Не установлено время начала торгового дня!" , "Ошибка" , MB_OK | MB_ICONHAND );
     return ( INIT_FAILED );
  } 
   Print ( "Exgange Fee = " , GetExgangeFee( start_day_time, a_deals ), "; Deals = " , a_deals );
   return ( INIT_SUCCEEDED );
}
 
Михаил :

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

SetStDayTime() işlevi, işlem gününün başlangıç saatini (istek anında) döndürür.

GetExgangeFee() işlevi, değişim komisyonunu ve işlem günü başına işlem sayısını (istek anında) döndürür:

Eh, "Hindu Coder - 2015" unvanı için eşi görülmemiş bir yarışmacı.

SetStDayTime() iki satırla çözülür. Ama tabiki gerek yok...

 

Michael, işlevlerin için teşekkürler!

Bazı bisikletleri icat etmem iptal edildi)

 
Михаил :

Gerçekten gerekli.

Ve nasıl?

Zamanın sayısal temsili ile çalışmak gerekir.

 datetime a= TimeTradeServer (); 

Gün başlama saati:

 datetime r=(a/ 86400 )* 86400

Bugün saat 19:00:

 datetime r=(a/ 86400 )* 86400 + 19 * 3600 ;

Bugün 19:00'daki saat mevcut saatten daha büyükse, dünün 19:00'ına ihtiyaç vardır:

 if (r>a)r-= 86400 ;

Burada, hafta sonunu atlamanız gerekiyorsa , haftanın gününü kontrol edin, Pazar ise 86400 * 2 çıkarın, Cumartesi ise 86400 çıkarın (Cuma almak için).

Bunun gibi bir şey.

Ardından, gerekirse görüntülemek için bir dizeye çevirin:

TimeToStr(r)
 
Михаил :

Ve yüksek yıl?

Ve şimdi, düşüncelerinizi somut kodlara çevirin.

İşlevimi kendi yönteminle ve İKİ satırda söylediğin gibi yeniden yaz!

Artık yıl ne olacak? Her şey yoluna girecek.

Kendiniz uygulayın, kodunuzu tam olarak anlamak istemiyorum, bir şeyi kaçırırsam sevinirsiniz.

Neden: