MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 704

 
Alexander_K2 :

Ama bir şeyler gerçekten doğru değil...

Onlar. OrderSelect'i bir kez yapıyorum ve sonra tekrar fonksiyondan... Bir çeşit şeytanlık...

  1. Biletle bir sipariş seçtiniz
  2. Sipariş sayısını kontrol etme işlevine gitti. Birden fazla sipariş varsa, mevcut tüm siparişler saymak için döngüde tek tek seçilir.
  3. Fonksiyondan döndükten sonra, terminaldeki siparişler listesinde sonuncusu seçilir ve bilet için 1. adımda seçtiğiniz sipariş olması gerekmez.
  4. Ardından, önceden seçilmiş yeni siparişin kapanış saatini kontrol eder ve bilet tarafından seçildiği iddia edileni kapatmaya çalışırsınız, ancak seçimi zaten kaybolmuştur.

Basit mantık...

İşlem sırasını takip edin.

Açıkçası, önce miktarı kontrol etmeniz, ardından istediğiniz sırayı seçmeniz ve ardından üzerinde ihtiyacınız olan işlemleri gerçekleştirmeniz gerekiyor.

 
Maxim Kuznetsov :

sipariş dizisini hangi yönde görüyorsunuz?

"revizyon" sırasında kapatmalar / silmeler mümkünse, ters yöne bakmak daha iyidir. OrdersTotal()-1'den 0 dahil.

yoksa gelebilirsin :-)


bir şekilde neredeyse bu şekilde kişisel bir kase keşfettim :-)

eski siparişleri "zamanın derinliklerinden" bugüne silmek (bir kez, hepsi değil) testçi karlılığını bir tür cennete yükseltti :-)

 
Artyom Trishkin :
  1. Biletle bir sipariş seçtiniz
  2. Sipariş sayısını kontrol etme işlevine gitti. Birden fazla sipariş varsa, mevcut tüm siparişler saymak için döngüde tek tek seçilir.
  3. Fonksiyondan döndükten sonra, terminaldeki siparişler listesinde sonuncusu seçilir ve bilet için 1. adımda seçtiğiniz sipariş olması gerekmez.
  4. Ardından, önceden seçilmiş yeni siparişin kapanış saatini kontrol eder ve bilet tarafından seçildiği iddia edileni kapatmaya çalışırsınız, ancak seçimi zaten kaybolmuştur.

Basit mantık...

İşlem sırasını takip edin.

Açıkçası, önce miktarı kontrol etmeniz, ardından istediğiniz siparişi seçmeniz ve ardından ihtiyacınız olan işlemleri yapmanız gerekir.

Böyle mi yaptı:

 RefreshRates ();
         total_orders_NZDUSD=TotalOrders( "NZDUSD.I" );
         if ( OrderSelect (ticket_sell_NZDUSD, SELECT_BY_TICKET )== true )
         {
         ctm_ticket_sell_NZDUSD= OrderCloseTime ();
         order_type_NZDUSD= OrderType ();
             if (total_orders_NZDUSD> 0 )
            {
               if (ctm_ticket_sell_NZDUSD== 0 )
               {
                   if (order_type_NZDUSD== OP_SELL )
                  {
                   double AskNorm= NormalizeDouble ( Ask , Digits );
                   OrderClose (ticket_sell_NZDUSD, 0.01 ,AskNorm, 0 );
                  }
               }
            }
         }

Önce siparişlerin sayısını, sonra diğer her şeyi ayarladım.

Teşekkürler, Artem. İşe yarayacak - Benden kase. Beni öldüren hata bu...

 

Ondalık basamak sayısı nasıl sayılır?

örneğin, minimum lotun 0.01 olduğunu öğrendim.

 MarketInfo ( "EURUSD" , MODE_MINLOT )

Şimdi buradaki ondalık basamak sayısının 2 olduğunu nasıl anlayabilirim?
daha sonra sipariş hacmini iki ondalık basamağa normalleştirmek için.

 
multiplicator :

Ondalık basamak sayısı nasıl sayılır?

örneğin, minimum lotun 0.01 olduğunu öğrendim.

Şimdi buradaki ondalık basamak sayısının 2 olduğunu nasıl anlayabilirim?
daha sonra sipariş hacmini iki ondalık basamağa normalleştirmek için.

Bunu dene.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot( double lo, bool ro= False , string sy= "" ) {
   double l, k;
   if (sy== "" || sy== "0" ) sy= Symbol ();
   double ls= MarketInfo (sy, MODE_LOTSTEP );
   double ml= MarketInfo (sy, MODE_MINLOT );
   double mx= MarketInfo (sy, MODE_MAXLOT );

   if (ml== 0 ) ml= 0.1 ;
   if (mx== 0 ) mx= 100 ;

   if (ls> 0 ) k= 1 /ls; else k= 1 /ml;
   if (ro) l= MathCeil (lo*k)/k; else l= MathFloor (lo*k)/k;

   if (l<ml) l=ml;
   if (l>mx) l=mx;

   return (l);
}
 
Alekseu Fedotov :

Bunu dene.

Neden böyle bir çöp teklif ediyorsun?

çarpan :

Ondalık basamak sayısı nasıl sayılır?

örneğin, minimum lotun 0.01 olduğunu öğrendim.

Şimdi buradaki ondalık basamak sayısının 2 olduğunu nasıl anlayabilirim?
daha sonra sipariş hacmini iki ondalık basamağa normalleştirmek için.

Burada makalede bitmiş bir işlev var.

 //+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue( double volume, string & description )
  {
//--- минимально допустимый объем для торговых операций
   double min_volume= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
   if (volume<min_volume)
     {
       description = StringFormat ( "Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f" ,min_volume);
       return ( false );
     }

//--- максимально допустимый объем для торговых операций
   double max_volume= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );
   if (volume>max_volume)
     {
       description = StringFormat ( "Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f" ,max_volume);
       return ( false );
     }

//--- получим минимальную градацию объема
   double volume_step= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_STEP );

   int ratio=( int ) MathRound (volume/volume_step);
   if ( MathAbs (ratio*volume_step-volume)> 0.0000001 )
     {
       description = StringFormat ( "Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f" ,
                               volume_step,ratio*volume_step);
       return ( false );
     }
   description = "Корректное значение объема" ;
   return ( true );
  }

Bu işlevin döndürülen sonucuna bağlı olarak yalnızca bir eylem eklemek için kalır.

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
 
Açılırken terminalin sırayı gerekli ondalık basamak sayısına göre normalleştirdiğini görüyorum.
çok koydum
 OrderSend ( Symbol (), OP_BUY , 1.11111111 , Ask , 3 , 0 , 0 );
ve anlaşma 1.11'lik bir hacimle açıldı.

yani belki hiçbir şeyi normalleştirmenize gerek yok?
 
multiplicator :
Terminali açarken, sırayı gereken ondalık basamak sayısına göre normalleştirdiğini görüyorum.
belki hiçbir şeyi normalleştirmenize gerek yoktur?

Editör aynı şeyi yaparsa - gerek yok.

 
multiplicator :
Terminali açarken, sırayı gereken ondalık basamak sayısına göre normalleştirdiğini görüyorum.
belki hiçbir şeyi normalleştirmenize gerek yoktur?

Daha sonra hata üstüne hata almak istiyorsanız normalleştirmeyin.

 
Artyom Trishkin :

Daha sonra hata üstüne hata almak istiyorsanız normalleştirmeyin.

Bazı nedenlerden dolayı terminal hata göstermiyor)