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

 
Motzaart :

Tünaydın.

Çoklu para birimi Uzman Danışmanında, açık bir pozisyon tetiklendiğinde karşı hareket için verilmiş bekleyen bir emri kapatmanız gerekir.

Şimdi, kârla kapatırken, bekleyen tüm emirler tüm para birimlerinde kapatılır.

Yalnızca döviz çiftine bağlı bekleyen emir kapatılacak ve geri kalanı yerleştirilmiş kalacak şekilde kod nasıl değiştirilir?

Bu kodda nelerin değiştirilmesi gerekiyor?:

Bu koddaki Mn, BUY_STOP veya SELL_STOP bekleyen emrin sihirli numarasıdır.

Mantık öyledir ki, kâr al ile açık bir pozisyonu kapattığınızda, bu sihirle verilen emir kalır ve teorik olarak silme komutu yürütülür.

Bu, her bir çifti test ederken çalışır. Ancak, diğer para birimleri ile çalışılması durumunda, tüm çiftler için verilen tüm siparişler silinir.

Kim yapabilir yardım edin.

Kimsenin bu sorunla uğraşmaması gerektiğini anlıyorum, ama belki birinin hazır bir şablonu vardır?

Çok minnettar kalırım.

Orada ne yaptığınızı anlamak için kodu editöre kopyalamanız ve normal stil (Ctrl+<) yapmanız gerekiyordu.

Yani: Orada yığılanları kodda yorumladım:

 //+------------------------------------------------------------------+
if (OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   operation= 0 ; // неиспользуемая переменная
     { // лишняя скобка
       for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
        {
         OrderSelect (i, SELECT_BY_POS); // нет проверки на результат выделения ордера в списке, и если ордер не выбран, то всё последующее вызовет ошибки
         int   type   = OrderType();
         bool result = false ;
         switch (type)
           { // К СВЕДЕНИЮ - ВСЕ ОПЕРАТОРЫ break ЗАКОММЕНТИРОВАНЫ, А ЗНАЧИТ - ВСЕ СТРОКИ КОДА ОПЕРАТОРА switch ВЫПОЛНЯЮТСЯ ВСЕГДА
             case OP_BUYSTOP   : // Если выбран отложенный BuyStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5 , Red);   //break;
             case OP_SELLSTOP  : // Если выбран отложенный SellStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5 , Red);   //break;
               // Независимо от типа выбранного ордера (отложенный или позиция) удаляем его как отложенный, что для позиции вызовет ошибку
               result = OrderDelete(OrderTicket());   //break;
           }
        }
     } // лишняя скобка
  }
//+------------------------------------------------------------------+

Sonuç olarak, kodunuz bunu yapar, yani şu koda eşdeğerdir:

 //+------------------------------------------------------------------+
if (OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   bool result= false ;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS)) {}
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5 , clrRed );
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5 , clrRed );
      result = OrderDelete(OrderTicket());
     }
  }
//+------------------------------------------------------------------+

Şimdi sor - ondan ne elde etmek istedin?

 
Artyom Trishkin :

Orada ne yaptığınızı anlamak için kodu editöre kopyalamanız ve normal stil (Ctrl+<) yapmanız gerekiyordu.

Yani: Orada yığılmış olanı kodda yorumladım:

Sonuç olarak, kodunuz bunu yapar, yani şu koda eşdeğerdir:

Şimdi sor - ondan ne elde etmek istedin?

TAMAM.

 if (OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?

tam burada:

 extern int mn; //магический номер открытой позиции
int Mn= 10 *mn; //магический номер отложенного ордера
int TimFr1= 72 ,TimFr2= 24 ,TimFr3= 24 ;

int start()
 { if ( Symbol ()== "EURUSD" )mn= 1 ; if ( Symbol ()== "GBPUSD" )mn= 2 ; if ( Symbol ()== "USDCHF" )mn= 3 ; if ( Symbol ()== "USDJPY" )mn= 4 ;
   if ( Symbol ()== "USDCAD" )mn= 5 ; if ( Symbol ()== "EURGBP" )mn= 6 ; if ( Symbol ()== "AUDUSD" )mn= 7 ; if ( Symbol ()== "NZDUSD" )mn= 8 ;
   if ( Symbol ()== "EURJPY" )mn= 9 ; if ( Symbol ()== "EURCHF" )mn= 10 ;

Bir pozisyon açarken (OP_BUY veya OP_SELL ), bekleyen emirler (OP_SELLSTOP ve OP_BUYSTOP) sırasıyla aynı anda verilir.

Kar al ile açık bir pozisyon kapatılırken ilgili bekleyen emir iptal edilmelidir. Bu algoritma tüm döviz çiftlerinde bulunur.

Aynı zamanda, diğer para birimlerinde verilen diğer bekleyen emirler kalmalıdır.

 

Hepinize iyi günler!

MTF_RSI anahtarlarının bir göstergesi var

 input ENUM_TIMEFRAMES       TimeFrame   =   0 ;

Söylesene, grafiği değiştirirken TimeFrame'in otomatik değişimini bir şekilde ayarlamak mümkün mü?

gibi bir şey

 if (TimeFrame= Period ())
   TimeFrame= "Следующий период" ;        
 
MakarFX :

Hepinize iyi günler!

MTF_RSI anahtarlarının bir göstergesi var

Söylesene, grafiği değiştirirken TimeFrame'in otomatik değişimini bir şekilde ayarlamak mümkün mü?

gibi bir şey

Bir yapı veya çok boyutlu bir dizi oluşturun ve gerekli boyut boyunca çalışmasına izin verin, kriter karşılanırsa bir sütunla (her sütun kendi zaman diliminden sorumludur), değilse başka bir sütunla çalışırız ve bu kadar. Programın kendisi aynı anda tüm zaman dilimlerine erişime sahiptir, bu yüzden yazdıklarınız mümkündür, ancak uygulama çok hacimlidir ve bu kadar çok iş çok kapsamlı olduğu için forumda size gösterilmeyecektir.

 
Seric29 :

Bir Yapı veya Çok Boyutlu Dizi Oluşturun

Teşekkür ederim.

 

Bu kod neden çalışmıyor?

 typedef double (*CenBr)( string , int , int );CenBr cn_br[ 4 ]; //глобально
//В Ините пытюсь сохранить указатель на функцию iOpen и ничего не выходит
cn_br[ 0 ]= iOpen ;

basit fonksiyonlarla çalışıyor ama bazı sıkıntılar var.

 
MakarFX :

Teşekkür ederim.

создаём массив double BarOCLH[ 1000 ][ 2 ][ 4 ]
далее сохраняем цену открытия 0 вого бара дневного таймфрейма
BarOCLH[ 0 , 0 , 0 ]= iOpen ();
далее сохраняем цену открытия 0 вого бара часового таймфрейма
BarOCLH[ 0 , 1 , 0 ]= iOpen ();и т.д ну а дальше критерируйте с каким столбцом работать
 
Seric29 :
Benimle mi konuşuyorsun?
 
MakarFX :
Benimle mi konuşuyorsun?

evet sana. Her döngüde ve her fonksiyonda her ayrıntıda zaman dilimleriyle oynamak zorunda kalacaksınız. Bu yüzden çok boyutlu dizileri kullanmanızı öneririm.

 
Seric29 :

evet sana. Her döngüde ve her fonksiyonda her ayrıntıda zaman dilimleriyle oynamak zorunda kalacaksınız. Bu yüzden çok boyutlu dizileri kullanmanızı öneririm.

Bu soruyu çözmek daha kolaydır:

   switch (period)
     {
       case PERIOD_M1   : TimeFrame = PERIOD_M5 ;   break ;
       case PERIOD_M5   : TimeFrame = PERIOD_M15 ; break ;
       case PERIOD_M15 : TimeFrame = PERIOD_M30 ; break ;
       case PERIOD_M30 : TimeFrame = PERIOD_H1 ;   break ;
       case PERIOD_H1   : TimeFrame = PERIOD_H4 ;   break ;
       case PERIOD_H4   : TimeFrame = PERIOD_D1 ;   break ;
       case PERIOD_D1   : TimeFrame = PERIOD_W1 ;   break ;
       case PERIOD_W1   : TimeFrame = PERIOD_MN1 ; break ;
       case PERIOD_MN1 : TimeFrame = PERIOD_MN1 ; break ;
       default :         return ( INIT_FAILED );
     }