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

 
Vitaly Muzichenko # :

Katılacağım :)

DAX30 endeksi var = 9'dan 22'ye kadar alıntı

M15, H1, vb. Zaman Çerçevesinde bir oturumda kaç çubuk olduğunu bulma.

Maksim Kuznetsov # :

(22*3600-9*3600)/PeriodSaniye(M15)

ancak bu idealdir - "çok sayıda bar 9:00 ile 22:00 arasında olmalıdır".

Zaman çerçevesi ne kadar küçükse, hata o kadar güçlüdür, gerçekte neredeyse her zaman daha azı vardır. Tarihe göre "her N çubuk - bir sonraki seans" hesaplamak mümkün olmayacak

Her şey çok daha kolay...

 int    Bars ( 
   string            symbol_name,     // имя символа 
   ENUM_TIMEFRAMES   timeframe,       // период 
   datetime          start_time,       // с какой даты 
   datetime          stop_time         // по какую дату 
   );
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Bars - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Hepinize iyi günler.

Yardımınıza ihtiyaçım var.

EA, mevcut karı hesaplamak için yerleşik bir işleve sahiptir:

 double GetProfitFromStart()
  {
   double lp= 0 ,cp= 0 ;
   for ( int i= 0 ; i<OrdersHistoryTotal(); i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return (lp+cp);
  }
void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
       if (CountOrders()== 0 )
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
       if (bSignalBuy() == true )
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
       if (bSignalSell() == true )
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL( "nextlot"    , 1 , 5 , 0 ,Color1(), StringConcatenate ( "CURRENT LOT: " ,DoubleToStr(LOT(), 2 )));
      DrawLABEL( "currentlot" , 1 , 5 , 0 ,Color2(), StringConcatenate ( "NEXT LOT: " ,DoubleToStr(LOT(), 2 ))); 
       DrawLABEL( "lab_Take" , 1 , 5 , 0 ,Color(GetProfitFromStart()> 0 ,Lime,Red), StringConcatenate ( "Profit: " ,DoubleToStr(GetProfitFromStart(), 2 )));
      TrailingOrders();
   }

void OnTick yukarıdaki gibi oluşturulmuştur.

Aşağıdaki koşullar karşılandığında kar sayacı nasıl 0.0'a sıfırlanır:

if(CountOrders()==0) && (GetProfitFromStart()>0

yani, tüm siparişler kapatılır ve son sipariş kapatıldığında toplam kâr > 0???

 

MT4 yüklendi. Terminali kapattıktan sonra alıntıları kaydetmez - her yenisini yüklediğinde.

 
Maxim Kuznetsov # :

4-ke'de bile " önce açıp sonra değiştirmek " daha iyidir.

Herkes, bir Zarar Durdur'un aynı anda yerleştirilmesiyle piyasaya açılmanıza izin vermez.

Bu arada, Stop Loss her yerde olmaz. Aynı zamanda, komisyoncu sunucusunda işlenen bir durdurma emridir, bu onun kişisel hizmetidir (liyakat, risk, kazanç) ve kendinizi hayal ettiğiniz yerde değil, ticaret camı durdurma emri yoktur.

Teşekkürler, evet, farklı brokerlerdeki bir demo bile çok farklı koşullara sahip görünüyor.

 
законопослушный гражданин # :

Hepinize iyi günler.

Yardımınıza ihtiyaçım var.

EA, mevcut karı hesaplamak için yerleşik bir işleve sahiptir:

void OnTick yukarıdaki gibi oluşturulmuştur.

Aşağıdaki koşullar karşılandığında kar sayacı nasıl 0.0'a sıfırlanır:

if(CountOrders()==0) && (GetProfitFromStart()>0

yani, tüm siparişler kapatılır ve son sipariş kapatıldığında toplam kâr > 0???

Çünkü görev net değil. Sayma işlevi, her seferinde emirler/pozisyonlar üzerinde yinelemeye başlar ve karı sıfırdan toplar.

 double lp= 0 ,cp= 0 ;

Neyi sıfırlamak istiyorsun? Açık pozisyonunuz/piyasa emriniz yoksa, sayım işlevi sıfır döndürür. Kendini sıfırlayacaktır)))

 
законопослушный гражданин # :

Hepinize iyi günler.

Yardımınıza ihtiyaçım var.

Aşağıdaki koşullar karşılandığında kar sayacı nasıl 0.0'a sıfırlanır:

yani, tüm siparişler kapatılır ve son sipariş kapatıldığında toplam kâr > 0???

Bundan tam olarak ne çıkmaz?

 

İyi zaman. Lütfen yardım et.

Negatif iadeli kapalı siparişler arıyorum.
Sonuç olarak, atlıyor, tüm olumsuz siparişlerin sonucunu alıyorum.

Yazmayı öğreniyorum.

 double Minus_profit(){
 for ( int i=OrdersHistoryTotal()- 1 ; i>= 0 ; i--){
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)){
         if (OrderSymbol() == Symbol () && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OP_SELL)){
           if (OrderCloseTime()>=time && OrderTicket()>ticket){
             if (OrderProfit()+OrderSwap()+OrderCommission()< 0 ){
             time=OrderCloseTime();
             ticket=OrderTicket();
             profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
             result=profit+swap+comis;   
   }}}}} return (result);
}
 
Alexander Avksentyev # :

İyi zaman. Lütfen yardım et.

Negatif iadeli kapalı siparişler arıyorum.
Sonuç olarak, atlıyor, tüm olumsuz siparişlerin sonucunu alıyorum.

Yazmayı öğreniyorum.

Bir bakışta sondan pozisyonları sıraladığınızı ve aynı zamanda değişkene kapanış saatini yazdığınızı görüyorum. En son kapatılan pozisyonun zamanını yakalamış olabilirsiniz ve aşağıdaki koşul artık doğru olmayacaktır:

OrderCloseTime()>=time

çünkü diğer pozisyonların kapanma süresi daha kısadır. Her şey sıralamaya bağlı olacak, ancak bu sorun standart sıralamada ortaya çıkacak.


Ve bu durumu düzelt

(OrderType() == OP_BUY || OP_SELL)

üzerinde

(OrderType() == OP_BUY || OrderType() == OP_SELL)

oh evet .. hatırladığım kadarıyla, eğer pozisyon geçmişten alınırsa, takaslar ve komisyonlar ile nihai sonuç zaten OrderProfit() içinde saklanacaktır. Açık pozisyonlarda - hayır, her şey özetlenmelidir. Ama bu doğru değil, kontrol edin.

 
Nikita Chernyshov # :

Bir bakışta sondan pozisyonları sıraladığınızı ve aynı zamanda değişkene kapanış saatini yazdığınızı görüyorum. En son kapatılan pozisyonun zamanını yakalamış olabilirsiniz ve aşağıdaki koşul artık doğru olmayacaktır:

çünkü diğer pozisyonların kapanma süresi daha kısadır. Her şey sıralamaya bağlı olacak, ancak bu sorun standart sıralamada ortaya çıkacak.


Ve bu durumu düzelt

üzerinde

oh evet .. hatırladığım kadarıyla, eğer pozisyon geçmişten alınırsa, takaslar ve komisyonlar ile nihai sonuç zaten OrderProfit() içinde saklanacaktır. Açık pozisyonlarda - hayır, her şey özetlenmelidir. Ama bu doğru değil, kontrol edin.

Teşekkür ederim. normalde böyle çalışır.

 double Minus_profit(){
time= TimeCurrent ();
 for ( int i= 0 ; i<OrdersHistoryTotal(); i++){
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)){
       if (OrderSymbol() == Symbol () && OrderMagicNumber()==Magic){
         if (OrderType() == OP_BUY || OrderType() ==OP_SELL){
         if (OrderCloseTime()>=time){
           if (OrderProfit()+OrderSwap()+OrderCommission()<= 0 ){
              time=OrderCloseTime();
              profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
              result=profit+swap+comis;   
   }}}}}} return (result);
}

Daha ileri; Olumlu karlı bir sipariş karşınıza çıktığında, sonucu sıfırlamanız ve olumsuz olanları daha fazla aramanız gerekir.

 
Alexander Avksentyev # :

İyi zaman. Lütfen yardım et.

Negatif iadeli kapalı siparişler arıyorum.
Sonuç olarak, atlıyor, tüm olumsuz siparişlerin sonucunu alıyorum.

Yazmayı öğreniyorum.

Bu ve benzeri durumlar için bir hata ayıklayıcı kullanmanızı öneririm.