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

 
Artyom Trishkin :

Anladığım kadarıyla, takip etmesi gereken manuel olarak açılan pozisyonun biletini danışmana bir şekilde belirtmeniz gerekiyor.

  1. Danışmana yeni açılan pozisyonların takibini ekleyin ve sihir yoksa manuel olarak açılır. Aynı zamanda, EA, bu pozisyonu açmak için fiyat ve açılış çubuğundaki simgeyi ayarlamalıdır. Nesne adı, bu tür tüm nesneler için nesnenin ortak adını içeren bir önek içermelidir, örneğin - "manuel_" ve konum bileti mevcut olmalıdır. Sonuç olarak, oluşturulan nesnenin adı şu şekilde olabilir: "manuel_12345678". Burada: manual_ - önek, 12345678 - pozisyon bileti.
  2. Expert Advisor'a bir OnChartEvent() ekleyin ve nesne üzerindeki fare tıklama olayını izleyin. Nesnenin adını analiz edin ve bir manual_ alt dizisi varsa, manual_'den sonraki sayının ne olduğuna bakın. Bu numara, tıkladığınız pozisyonun biletidir.
  3. Ayrıca, bu bir teknik meselesidir: Expert Advisor/terminal/bilgisayar/dünya yeniden başlatıldığında kaybolmaması için bulunan numarayı kaydetmeniz gerekir... Örneğin, terminalin kaynaklarında veya global değişkenlerinde .
  4. EA bu kaynağı okumalı ve trol etmesi gereken pozisyonların biletlerini ondan almalıdır.
  5. Trol döngüsünde, seçilen pozisyonun biletini alın ve kayıtlı bilet listesinde bu numarayı arayın. Böyle bir bilet bulunursa, bu biletin bulunduğu pozisyon izlenmelidir.
  6. Pozisyon sayısını değiştirirken, kapalı pozisyonun biletini kontrol etmeniz ve kayıtlı listede bulmanız gerekir. Listede böyle bir bilet varsa, bu listeden çıkarılmalıdır - pozisyon artık orada değildir ve biletinin takip eden biletler listesinde hiçbir ilgisi yoktur.
Bunun gibi bir şey. Dizime mantık yazdım, bu yüzden ne olduğunu hesaba katamadım ...


Açıklama için teşekkürler, neden bahsettiğinizi şimdi anladım.

Şimdiye kadar, danışmanı kullanmak için kayma hakkında fazla bir şey bilmiyorum - mql derslerinde 3'ün ayarlanması önerilir (EURUSD ile ilgiliydi), ancak para birimlerinin likiditesi farklıdır ve hareket hızı aynıdır. Dolar çiftleri ve haçlar için sakin bir piyasada hangi rakamlar yönlendirilebilir?

 
CopyOpen , CopyHigh, CopyLow ve CopyClose işlevlerini kullanarak çok boyutlu bir arabelleği doldurmak mümkün müdür, yoksa yapamam. Açıklama, dinamik bir diziye kopyalandığını söylüyor - ve dinamik bir dizi çok boyutlu MQL5 olabilir
 
Alexandr Sokolov :
CopyOpen , CopyHigh, CopyLow ve CopyClose işlevlerini kullanarak çok boyutlu bir arabelleği doldurmak mümkün müdür, yoksa yapamam. Açıklama, dinamik bir diziye kopyalandığını söylüyor - ve dinamik bir dizi çok boyutlu MQL5 olabilir

tek boyutlu bir dizi kullanın ...

 
Alexandr Sokolov :
CopyOpen , CopyHigh, CopyLow ve CopyClose işlevlerini kullanarak çok boyutlu bir arabelleği doldurmak mümkün müdür, yoksa yapamam. Açıklama, dinamik bir diziye kopyalandığını söylüyor - ve dinamik bir dizi çok boyutlu MQL5 olabilir

Yapıları anlamakta zorluk çekiyorsanız, ArrayCopyRates kullanabilirsiniz.

 int    ArrayCopyRates ( 
   void &     dest_array[][],     // массив, переданный по ссылке 
   string     symbol= NULL ,       // инструмент 
   int        timeframe= 0          // таймфрейм 
   );

Anlamakla ilgili her şey yolundaysa, o zaman daha iyidir

CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 

Merhaba. Birkaç kişiden bir Uzman Danışman oluşturmaya çalıştım, her şey strateji test cihazında olması gerektiği gibi çalışıyor (görselleştirme modunda kontrol ettim). Demo hesap açtım ve periyodik olarak şu sorun çıkıyor, sipariş açılıp hemen siliniyor ve saat değişene kadar bir saat boyunca böyle devam ediyor. Aynı zamanda bir sipariş girme ve silme koşulunun oluştuğunu düşündüm, ancak burada silme yalnızca zamanla, bu bloğun tamamını sildiğimde hata kaybolmadı. Kimse için zor değilse, bana hatanın nerede olduğunu söyleyin.

 int start()
{
   // модификация до безубытка
   if ( MathAbs (( OrderOpenPrice ()- Ask )/ Point ) > BUP && CountBuy() > 0 )
      ModifyLoss();

   if ( MathAbs (( OrderOpenPrice ()- Bid )/ Point ) > BUP && CountSell() > 0 )
      ModifyLoss();
      
      
   CurrHour = TimeHour ( TimeCurrent ());
   
   if (CloseByTime == true && DayOfWeek () == DayEnd && CurrHour >= CloseHour)
   {
       if (CountTrades() > 0 || CountStop() > 0 ) CloseTrades();
   
     
   }
     

   if (DayStart == DayOfWeek () && CurrHour == StartHour && ((!SetLimits && CountStop() == 0 ) || (SetLimits && CountLimits() == 0 )) && CountTrades() == 0 )
   {
      high = iHigh ( Symbol (), 0 , 1 );
      low  = iLow ( Symbol (), 0 , 1 );
      spread = MarketInfo ( Symbol (), MODE_SPREAD );
      
       if ((high - low)/ Point <= MaxPips && spread < Maxspread)
      {
         buy  = NormalizeDouble (high + Indent* Point , Digits );
         sell = NormalizeDouble (low - Indent* Point , Digits );
        
      
         if (FixedLot > 0 )
            Lots = FixedLot;
         else Lots = GetLots();

         if (UseMartingale == true )
         {
             if ( AccountBalance () < abalance) 
               Lots = getlotlast();
             else abalance = AccountBalance ();
         }
         
         if (!SetLimits)
         {
            tp_sell = ND(sell-spread* Point - TPP* Point );
            tp_buy  = ND(buy + spread* Point + TPP* Point );
         
            sl_sell = ND(sell + SLP* Point +spread* Point );
            sl_buy  = ND(buy-SLP* Point -spread* Point );
            
           if ( iClose ( NULL , 1440 , 1 ) < iMA ( NULL , 1440 ,PeriodMA, 0 , MODE_EMA , PRICE_CLOSE , 1 )) 
                  OrderSendReliable( Symbol (), OP_SELLSTOP , Lots, (sell-spread* Point ), Slippage, sl_sell,  tp_sell, comment, Magic, 0 , Red);
                                                                         
                                                                         else
                  OrderSendReliable( Symbol (), OP_BUYSTOP ,  Lots, (buy+spread* Point ),  Slippage, sl_buy, tp_buy,  comment, Magic, 0 , Blue);
                                                                       
         
            
         } else
         {
            tp_sell = ND(sell - MathAbs (buy-sell)*TakeProfitK);
            tp_buy  = ND(buy +   MathAbs (buy-sell)*TakeProfitK);
         
            sl_sell = ND(buy + MathAbs (buy-sell)*StopLossK);
            sl_buy  = ND(sell - MathAbs (buy-sell)*StopLossK);
         
            OrderSendReliable( Symbol (), OP_SELLLIMIT , Lots, buy,  Slippage, sl_sell, tp_sell,  comment, Magic, 0 , Red);
            OrderSendReliable( Symbol (), OP_BUYLIMIT ,  Lots, sell, Slippage, sl_buy,  tp_buy, comment, Magic, 0 , Blue);
         }
      }
   }
   return ( 0 );
}
 
craft11111 :

Merhaba. Birkaç kişiden bir Uzman Danışman oluşturmaya çalıştım, her şey strateji test cihazında olması gerektiği gibi çalışıyor (görselleştirme modunda kontrol ettim). Demo hesap açtım ve periyodik olarak şu sorun çıkıyor, sipariş açılıp hemen siliniyor ve saat değişene kadar bir saat boyunca böyle devam ediyor. Aynı zamanda bir sipariş girme ve silme koşulunun oluştuğunu düşündüm, ancak burada silme yalnızca zamanla, bu bloğun tamamını sildiğimde hata kaybolmadı. Kimse için zor değilse, hatanın nerede olduğunu söyleyin.

OrderSelect aracılığıyla bir döngü içinde yineleme yapmak gerekir

 int start()
{
   // модификация до безубытка
   if ( MathAbs (( OrderOpenPrice ()- Ask )/ Point ) > BUP && CountBuy() > 0 )
      ModifyLoss();

   if ( MathAbs (( OrderOpenPrice ()- Bid )/ Point ) > BUP && CountSell() > 0 )
      ModifyLoss();
      
OrderOpenPrice - Торговые функции - Справочник MQL4
OrderOpenPrice - Торговые функции - Справочник MQL4
  • docs.mql4.com
OrderOpenPrice - Торговые функции - Справочник MQL4
 

Anladığım kadarıyla koşul oluştuğunda seçim sırasının kullanıldığı modifikasyon fonksiyonuna geçiş oluyor. Evet ve ben de bu parçayı tamamen kaldırmaya çalıştım, yine de hata devam ediyor ve bir durumun meydana geldiği her zaman açık değil. yine, test cihazında her şeyin yolunda gitmesi utanç verici

 void ModifyLoss()
{
   for ( int trade = OrdersTotal () - 1 ; trade >= 0 ; trade--) 
   {
       OrderSelect (trade, SELECT_BY_POS , MODE_TRADES );
       if ( OrderSymbol () != Symbol () || OrderMagicNumber () != Magic) continue ;
       if ( OrderType () == OP_BUY )
      {
         SL = ND( OrderOpenPrice ());
         if ( OrderStopLoss () < SL && ( Ask - OrderOpenPrice ())/ Point >= BUP)
         {
             if (SL != ND( OrderStopLoss ()))
               OrderModify ( OrderTicket (), OrderOpenPrice (), SL, OrderTakeProfit (), 0 );
         }
      } else
       if ( OrderType () == OP_SELL )
      {
         SL = ND( OrderOpenPrice ());
         if ( OrderStopLoss () > SL && ( OrderOpenPrice ()- Bid )/ Point >= BUP)
         {
             if (SL != ND( OrderStopLoss ()))
                 OrderModify ( OrderTicket (), OrderOpenPrice (), SL, OrderTakeProfit (), 0 );
         }
      }
   }
}
 
craft11111 :

Merhaba. Birkaç kişiden bir Uzman Danışman oluşturmaya çalıştım, her şey strateji test cihazında olması gerektiği gibi çalışıyor (görselleştirme modunda kontrol ettim). Demo hesap açtım ve periyodik olarak şu sorun çıkıyor, sipariş açılıp hemen siliniyor ve saat değişene kadar bir saat boyunca böyle devam ediyor. Aynı zamanda bir sipariş girme ve silme koşulunun oluştuğunu düşündüm, ancak burada silme yalnızca zamanla, bu bloğun tamamını sildiğimde hata kaybolmadı. Kimse için zor değilse, bana hatanın nerede olduğunu söyleyin.

Print(__FUNCTION__) ticaretini kontrol eden fonksiyonlarda veya Print(böyle ve-böyle bir blok, böyle-ve-bu parametreler) bloklarında belirtin. İşlevlerin/blokların hangi sırayla çalıştığını görün. İşe yarayan, ancak olmaması gereken ilk şey, o zaman onun için soru bu. "Burada eşzamanlı çalışması için oldukça uyumsuz koşulları tanımladım" gerçeğine güvenmek buna değmez. Belki bloğun çalışmaması gerekiyordu, ancak dış parametreler açılmasına izin verdi, belki de bloğun içindeki bir şey çalışmamalıydı.

 

OnChartEvent() , test cihazında çalışmıyor.

Lütfen test cihazında çalışabilecek bir düğme gösterin. Örneğin hangi bayrağın kaldırılacağına tıklayın ticaret = doğru; tekrar basın? takas=yanlış;

 
Ghabo :

OnChartEvent(), test cihazında çalışmıyor.

Lütfen test cihazında çalışabilecek bir düğme gösterin. Örneğin hangi bayrağın kaldırılacağına tıklayın ticaret = doğru; tekrar basın? takas=yanlış;

OnTick()'te düğmenin tıklanmasını kontrol edin. OnTick() içindeki test edici - kontrol çalışıyorsa, koşullu olarak yapılabilir, ancak gerçek hayatta bu kontrolün bloğu yürütülmez ve OnChartEvent() içinde kontrol olur.