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

 
ilnur17021992 :

Lütfen mevcut çiftte son 60 saniyede kapatılanemirlerin sayısını ve toplam kârını sayacak bir fonksiyon yazmama yardım edin. Dilimle doğru ifade edemiyorum.

   int CountClosedSellOrders= 0 , CountClosedBuyOrders;
   double ClosingSellProfit= 0 , ClosingBuyProfit;
   for ( int i= 0 ; i< OrdersHistoryTotal (); i++)
   {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderSymbol ()== Symbol ())
      {
    
         
      }
   }

Sanırım anlayacaksınız:

//----------------- Возвращает суммарный профит последних закрытых позиций ---------------------+
double GetProfitOldClosePos( string symb= "" , int type=- 1 , int mg=- 1 ) {
if (symb== "0" ) symb= Symbol ();
datetime gt= 0 ,ct= 0 ;
double pr= 0 ;
   for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--) {
   if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) {
     if ( OrderSymbol ()==symb &&(type< 0 || OrderType ()==type)&& OrderMagicNumber ()==mg) {
     ct= OrderCloseTime ();
     // 120 секунд разницы между закрытием первой и последней в сетке
       if ((gt<=ct && ct<=gt+ 120 ) || gt== 0 ) {
       gt=ct;
       pr+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
  }}}}
   return (pr);
}
 
ilnur17021992 :

Mevcut çiftte son 60 saniyede kapatılanemirlerin sayısını ve toplam kârını sayacak bir fonksiyon yazmama yardım et. Dilimle düzgün konuşamıyorum.

   int CountClosedSellOrders= 0 , CountClosedBuyOrders;
   double ClosingSellProfit= 0 , ClosingBuyProfit;
   for ( int i= 0 ; i< OrdersHistoryTotal (); i++)
   {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderSymbol ()== Symbol ())
      {
         if ( OrderType ()== OP_SELL )
         {
             if (. . .)                    
            {
               CountClosedSellOrders++;
               ClosingSellProfit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
            }
         if ( OrderType ()== OP_BUY )
         {
             if (. . .)                    
            {
               CountClosedBuyOrders++;
               ClosingBuyProfit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
            }
         }
      }
   }


   int CountClosedSellOrders= 0 ,CountClosedBuyOrders;
   double ClosingSellProfit= 0 ,ClosingBuyProfit;
//for(int i=0; i<OrdersHistoryTotal(); i++)
   for ( int i= OrdersHistoryTotal ()- 1 ;i>= 0 ;i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderSymbol ()== Symbol ())
        {
         if ( OrderCloseTime ()>= TimeCurrent ()- 60 )
           {
             if ( OrderType ()== OP_SELL )
              {
               CountClosedSellOrders++;
               ClosingSellProfit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
              }
             if ( OrderType ()== OP_BUY )
              {
               CountClosedBuyOrders++;
               ClosingBuyProfit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
              }
           }
        }
     }
...
 
Bir sipariş açarken takip eden bir durdurma nasıl belirlenir?
 
DenZell :
Bir sipariş açarken takip eden bir durdurma nasıl belirlenir?
Mümkün değil. Açtıktan sonra takip etmeyi bırakın.
 
trader781 :

fiyat sıfırsa veya ayarlanmamışsa, son siparişin fiyatını çizgi koordinatı olarak atarız. Bununla her şey yolunda

Dergi de normaldir, olması gerektiği gibi hesabı birleştirir. Depozito eksikliği ile ilgili hatalar görmüyorum.

Ama hat hala kırmızı. Yani satın alma hattı diyoruz, doğru, parametreleri geçiyoruz, ancak diğerleri aktarılıyor.

Bu koşul kesinlikle kodunuzdaki gibi yazılmamalıdır. "Kahramanca" üstesinden gelmek için kendiniz için zorluklar yaratırsınız)))

Kodda kırmızı çizgiyi oluşturan her şey yorumlanır, bu nedenle onu başka biri oluşturur. Ya da kodun o kısmı çalıştığından beri grafikte asılı duruyor.

Her şeyi daha önce önerdiğim gibi tavsiye ediyorum - tüm eylemleri yazdırın ve günlükte (hata) kodları döndürün, bu birçok soruya cevap verecektir.

 
Andrey Koldorkin :
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
  
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
  
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
Şablonunuz tamamlanmadı - büyük olasılıkla sihirbazda hesaplanan verilerin yazılacağı gösterge arabelleklerini belirtmediniz.

Ancak çoğu gösterge için temel ilke şudur:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   if (rates_total< 1 ) return ( 0 );               // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то проверять нужно это количество, а не 1
  
   //--- Действия для полного перерасчёта индикатора
   int limit=rates_total-prev_calculated;     // количество посчитанных уже баров
   if (limit> 1 ) {                             // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
      limit=rates_total- 1 ;                   // задаём количество требуемых для расчёта баров равным количеству баров в истории,
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
                                             // так же тут нужно при необходимости произвести инициализацию буферов индикатора
      }
  
   //--- Основной цикл индикатора
   for ( int i=limit; i>= 0 ; i--) {
       // тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
      ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/ 4.0 ;   // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
      }
  
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Vitalie Postolache :

Bu koşul kesinlikle kodunuzdaki gibi yazılmamalıdır. "Kahramanca" üstesinden gelmek için kendiniz için zorluklar yaratırsınız)))

Kodda kırmızı çizgiyi oluşturan her şey yorumlanır, bu nedenle onu başka biri oluşturur. Ya da kodun o kısmı çalıştığından beri grafikte asılı duruyor.

Her şeyi daha önce önerdiğim gibi tavsiye ediyorum - tüm eylemleri yazdırın ve günlükte (hata) kodları döndürün, bu birçok soruya cevap verecektir.

200 satırda mistisizm

:)

 
Artyom Trishkin :
Şablonunuz tamamlanmadı - büyük olasılıkla sihirbazda hesaplanan verilerin yazılacağı gösterge arabelleklerini belirtmediniz.

Ancak çoğu gösterge için temel ilke şudur:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   if (rates_total< 1 ) return ( 0 );               // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то проверять нужно это количество, а не 1
  
   //--- Действия для полного перерасчёта индикатора
   int limit=rates_total-prev_calculated;     // количество посчитанных уже баров
   if (limit> 1 ) {                             // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
      limit=rates_total- 1 ;                   // задаём количество требуемых для расчёта баров равным количеству баров в истории,
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
                                             // так же тут нужно при необходимости произвести инициализацию буферов индикатора
      }
  
   //--- Основной цикл индикатора
   for ( int i=limit; i>= 0 ; i--) {
       // тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
      ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/ 4.0 ;   // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
      }
  
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
TAMAM. Teşekkür ederim! Kendime aktardım. Bunu halledeceğim.
 

Lütfen yardım et!

ABCDEF dizesi var, onu 3 satıra nasıl böleriz (dize değişkenine kaydedin):

AB

CD

EF

 
-Aleks- :

Lütfen yardım et!

ABCDEF dizesi var, onu 3 satıra nasıl böleriz (dize değişkenine kaydedin):

AB

CD

EF

string    StringSubstr (
   string   string_value,     // строка
   int      start_pos,         // с какой позиции начать
   int      length= 0            // длина извлекаемой строки
   );
...