[ARŞİV!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 4. - sayfa 566

 
delf :

Belki doğru ifade edemedim :(

Emirleri açmak için bir algoritma var.

Herhangi bir son siparişi kapatma seçeneği için, bir sonrakinin diğer yönde açılması gerekir (sırasıyla koşullar göründüğünde).

Her şey çalışıyor, ancak örneğin satış yoluyla bir stop loss kapatılırsa ve bu yönde bir satış açmak için koşullar varsa, açılışlar devam eder. Ve satın almak için şartları beklemeniz gerekiyor.

Yani, son kapatılan siparişi, açılış ile çakışmayacak şekilde kontrol etmeniz gerekir (al-sat-al-sat değişimi). İşlemde olan veya sinyal bekleyen tek bir emir var.

Büyük olasılıkla OrdersHistoryTotal() aracılığıyla gerekli olduğunu anlıyorum, ancak çalışan bir Uzman Danışmanda nasıl görünebilir?

Teşekkür ederim.


Muhtemelen böyle bir yerde. Ancak geçmişte çok sayıda sipariş varsa, sipariş muhasebenizi kullanmak daha iyidir. https://www.mql5.com/ru/articles/1404 https://www.mql5.com/ru/articles/1390
 //+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link       ""
void CloseOrder( string signal)
   {
   int       i,Ticket=- 1 ,error; 
   double    Price;
   datetime time= 0 ;
   for (i= 0 ;i<OrdersHistoryTotal();i++)  
      {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_HISTORY));
         {
         error= GetLastError (); Print ( "Ошибка OrderSelect() = " , error);
      }
       if (OrderSymbol()== Symbol ()&&(OrderMagicNumber()==magic
      ||OrderClosePrice()==OrderStopLoss())
         {
         if (OrderCloseTime()>time)
            {
            time=OrderCloseTime();Ticket=OrderTicket();
         }
      }
   }
   if (! OrderSelect (Ticket,SELECT_BY_TICKET,MODE_HISTORY))
      {
      error= GetLastError (); Print ( "Ошибка OrderSelect() = " ,error);
   }
   if (OrderType()==OP_BUY&&signal== "CloseBUY" ||OrderType()==OP_SELL&&signal== "CloseSELL" ) return ;
   if (signal== "CloseBUY" )Price= NormalizeDouble (Bid, Digits );
   if (signal== "CloseSELL" )Price= NormalizeDouble (Ask, Digits );
   for (i= 0 ;i< OrdersTotal ();i++)  
      {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES));
         {
         error= GetLastError (); Print ( "Ошибка OrderSelect() = " ,error);
      }
       if (OrderSymbol()== Symbol ()&&(OrderMagicNumber()==magic)
         {
         if (OrderType()==OP_BUY&&signal== "CloseBUY" ||OrderType()==OP_SELL||signal== "CloseSELL" )
            {
            Ticket=OrderClose(OrderTicket(),OrderLots(),Price, 0 , CLR_NONE );
         }
      }
       if (Ticket< 0 )
         {
         error= GetLastError (); Print ( "Ошибка = " ,error);
      }
   }
   return ;
}
       
 
peshihod :

Daha katı bir versiyon

Cevap veren herkese çok teşekkürler, sonuç alındı, gerekli olan.
 
delf :

Belki doğru ifade edemedim :(

Emirleri açmak için bir algoritma var.

Herhangi bir son siparişi kapatma seçeneği için, bir sonrakinin diğer yönde açılması gerekir (sırasıyla koşullar göründüğünde).

Her şey çalışıyor, ancak örneğin satış yoluyla bir stop loss kapatılırsa ve bu yönde bir satış açmak için koşullar varsa, açılışlar devam eder. Ve satın almak için şartları beklemeniz gerekiyor.

Yani, son kapatılan siparişi, açılış ile çakışmayacak şekilde kontrol etmeniz gerekir (al-sat-al-sat değişimi). İşlemde olan veya sinyal bekleyen tek bir emir var.

Büyük olasılıkla OrdersHistoryTotal() aracılığıyla gerekli olduğunu anlıyorum, ancak çalışan bir Uzman Danışmanda nasıl görünebilir?

Teşekkür ederim.

Başkalarının kodlarını nasıl programlayacağınızı veya ayrıştıracağınızı öğrenmek istiyorsanız (CodaBase bunun için tasarlanmıştır) veya sorunu çözmek için algoritmadan başlayın. Sizin için kodlama istemek, öğrenmenin en umutsuz yoludur. Çoğu zaman, sorununuzu çözmede kodun en iyi versiyonunu almazsınız, komşunuz her dakika kapı zilinizi çaldığında ve "adınız ne" diye sorduğunda (alegorik) gibi bir şey - bu gereksiz (aşırı) hesaplamalarla ilgilidir.

Sorununuzu çözmek için algoritma aşağıdaki gibi olabilir. İlk olarak, "sizin" siparişleriniz olmadığından emin olun. Bu görev, test cihazı için değilse (burada if (OrdersTotal() == 0) koşuluyla sınırlandırılabilir), OrderMagicNumber() ve Symbol() ile eşleşen filtreler kullanılarak siparişler arasında yinelenerek çözülür. Ardından, bir sipariş açmak için (stratejinize göre) koşulu kontrol edersiniz. Bir sinyal varsa, son kapatılan siparişin OrderType() değerini hesaplamak için OrdersHistoryTotal() (genellikle listedeki sonuncusu) üzerinde yineleyin. Açılacak sinyal ve son kapatılan emrin türü uyuşmuyorsa, sinyal üzerinde bir emir açın.

Bu yaklaşım minimum hesaplama içerir ve test cihazında Expert Advisor optimizasyon süresini önemli ölçüde azaltır.

 
TarasBY :
Bir süre önce, son pozisyonları aramayı çözmek için size bir algoritma verdim . Ve sonra onlarla ne yapılacağı ÖNEMLİ DEĞİLDİR: STOP'ları saymak, silmek, değiştirmek. En azından "görüntüde ve benzerlikte" kod yazamıyorsanız, bu sizin (programlamanız) değil ...


Evet katılıyorum, programlama benim işim değil, bu yüzden burada öğreniyorum ve sorular soruyorum. Algoritmanıza pozisyon kapanışı eklemeye çalıştım ama işe yaramadı (tüm alış pozisyonları kapanmıştı), bu yüzden probleme diğer taraftan yaklaşmaya karar verdim ve bitmiş durumdaki son iki alış pozisyonunu kapatmanın çözümüne baktım. Bana sağlanan ve teklif edilen blok, kapanış .

Ve örneğinizi kullanarak son iki satın alma pozisyonunun nasıl kapatılacağını gösterirseniz çok minnettar olacağım. Nerede hata yaptığımı anlıyorum.

 double profits_buy_2pos()
{
     int ordercount = 0 , OpenOrders = OrdersTotal ();
     double pr_buy = 0 ;
     for ( int cnt = OpenOrders - 1 ; cnt >= 0 ; cnt--)   // scan all orders and positions. ..
    {
         if (! OrderSelect (cnt, SELECT_BY_POS)) return ( 0.0 );
         if (OrderSymbol() != Symbol ()) continue ;
         if (OrderMagicNumber() != magic) continue ;
         if (OrderType() != OP_BUY) continue ;
        pr_buy += OrderProfit();
        ordercount++;
         if (ordercount == 2 ) break ;
    } 
     Print ( "::::::::::::::::::::::::: pr_buy2 = " , pr_buy);   
     Print ( "::::::::::::::::::::::::: ordercount = " , ordercount);    
     return (pr_buy);   
}

 
TarasBY :

Başkalarının kodlarını nasıl programlayacağınızı veya ayrıştıracağınızı öğrenmek istiyorsanız (CodaBase bunun için tasarlanmıştır) veya sorunu çözmek için algoritmadan başlayın. Sizin için kodlama istemek, öğrenmenin en umutsuz yoludur. Çoğu zaman, sorununuzu çözmede kodun en iyi versiyonunu almazsınız, komşunuz her dakika kapı zilinizi çaldığında ve "adınız ne" diye sorduğunda (alegorik) gibi bir şey - bu gereksiz (aşırı) hesaplamalarla ilgilidir.

Sana tamamen katılıyorum. %100 haklısın. Bu doğru yol ve dürüstçe onu takip etmeye çalıştım. Ancak MQL4'ü ders kitabı düzeyinde çalışmak ve hedefsiz okumak hiçbir şeye yol açmadı. Herhangi bir nedenle, başkalarının kodlarını sökmek zorunda kaldım, çünkü çoğu zaman çılgın fikirlerimi programın çerçevesine sokmak imkansızdı. .... excel'de bir strateji oluşturmaya başladım (bana daha yakın ve daha net). Stratejinin temellerini atmak açısından oldukça başarılı ve nettir (tarihte tabii ki). Dürüst matematik, karı veya zararı olduğu gibi gösterir. Ama yine de ticaretin özelliklerini hesaba katmanız gerekiyor: dalgalı yayılma, takas, DC'lerin özellikleri, tüm bunları exel formüllerine koymak zaten zor. Bu yüzden excel ve MQL'de kar arasındaki farkın ne olduğunu görmek istedim. Dürüst olmak gerekirse - fark büyük, benim lehime değil. Neden, henüz bilmiyorum, her pozisyonu analiz edeceğim, belki danışmanda bir hata var, ama bu zaten benim.

Her durumda, bu forumdaki nazik insanlar, birçok insanın teşekkür ettiği belirli bir sorunun çözülmesine yardımcı oldu.

 
Ekburg :

hayır biri kapalıyken pozisyon seri numarası değiştirme sorunu çözüldü bunda bir yanlışlık olabilir diye defalarca kontrol ettim ama herşey yolunda , gerekli sıra seçilmiş ve stop Kayıp bunun için doğru hesaplanmış ancak sipariş değiştirilmek istemiyor. .

Hata 1, yalnızca OrderModify () işlevine iletilen tüm parametreler, değiştirilen siparişin sizin tarafınızdan (bilet numarasına göre) veya değişiklik için OrderSelect () işlevi tarafından seçilen tüm parametrelere eşitse atılır. Doğrulama kullanımına bir örnek:

Yalnızca "KimIV'ten Faydalı özellikler".

ModifyOrder() işlevi https://www.mql5.com/ru/forum/131859

 
rigonich :

Hata 1, yalnızca OrderModify () işlevine iletilen tüm parametreler, değiştirilen siparişin sizin tarafınızdan (bilet numarasına göre) veya değişiklik için OrderSelect () işlevi tarafından seçilen tüm parametrelere eşitse atılır.

1 (ERR_NO_RESULT) - parametrelerden hiçbiri değiştirilmediyse veya herhangi bir hata yoksa, ancak sonuç bilinmiyorsa, büyük olasılıkla basitçe, herhangi bir nedenle sipariş değiştirilmiyorsa...
 
abeiks :

Evet katılıyorum, programlama benim işim değil, bu yüzden burada öğreniyorum ve sorular soruyorum. Algoritmanıza pozisyon kapanışı eklemeye çalıştım ama işe yaramadı (tüm alış pozisyonları kapanmıştı), bu yüzden probleme diğer taraftan yaklaşmaya karar verdim ve bitmiş durumdaki son iki alış pozisyonunu kapatmanın çözümüne baktım. Bana sağlanan ve teklif edilen blok, kapanış .

Ve örneğinizi kullanarak son iki satın alma pozisyonunun nasıl kapatılacağını gösterirseniz çok minnettar olacağım. Nerede hata yaptığımı anlıyorum.

int Slippage = 3;
int Close_buy_2pos()
{
    int ordercount = 0, OpenOrders = OrdersTotal();
    for (int cnt = OpenOrders - 1; cnt >= 0; cnt--)   // scan all orders and positions. ..
    {
        if (!OrderSelect (cnt, SELECT_BY_POS)) return (ordercount);
        if (OrderSymbol() != Symbol()) continue;
        if (OrderMagicNumber() != magic) continue;
        if (OrderType() != OP_BUY) continue;
        if (OrderClose (OrderTicket(), OrderLots(), Bid, Slippage)) ordercount++;
        else return (ordercount);
        if (ordercount == 2) break;
    } 
    Print ("::::::::::::::::::::::::: ordercount = ", ordercount);    
    return (ordercount);   
}

Genel olarak, evet. Eğer "yaşlılık" seçeneğini kullanırsanız (ben kullanıyorum), o zaman bir döngü çalıştırmanız gerekir: önce, son açık SATIN AL pozisyonunu bulun, ardından biletle silin ve gerektiği kadar tekrarlayın.

PS AL ve SATIŞ için ayrı ayrı işlevler yazmak başlangıçta bir değişkendir (IMHO).

Ve bu durumda işlev çok daha karmaşık görünmeyecek:

 int Slippage = 3 ;
int Close_LastPos ( string fs_Symbol,
                   int fi_Magic,
                   int fi_Type = - 1 ,   // тип закрываемых позиций
                   int fi_cnt = 1 )     // количсетво закрываемых позиций
{
     int ordercount = 0 , OpenOrders = OrdersTotal ();
     double ld_PriceClose;
     for ( int cnt = OpenOrders - 1 ; cnt >= 0 ; cnt--)   // scan all orders and positions. ..
    {
         if (! OrderSelect (cnt, SELECT_BY_POS)) return (ordercount);
         if (OrderSymbol() != fs_Symbol) continue ;
         if (OrderMagicNumber() != fi_Magic) continue ;
         if (OrderType() != fi_Type) if (fi_Type != - 1 ) continue ;
         if (OrderType() > 1 ) continue ;
         if (OrderType() == OP_BUY) ld_PriceClose = NormalizeDouble (Bid, Digits );
         else ld_PriceClose = NormalizeDouble (Ask, Digits );
         if (OrderClose (OrderTicket(), OrderLots(), ld_PriceClose, Slippage)) ordercount++;
        else return (ordercount);
        if (ordercount == fi_cnt) break ;
    } 
     Print ( "::::::::::::::::::::::::: ordercount = " , ordercount);    
     return (ordercount);   
}
 
Ekburg :

1 (ERR_NO_RESULT) - parametrelerden hiçbiri değiştirilmediyse veya herhangi bir hata yoksa, ancak sonuç bilinmiyorsa, büyük olasılıkla basitçe, herhangi bir nedenle sipariş değiştirilmiyorsa...
ERR_NO_RESULT bir veya değil, yani Hata yok, ancak sonuç bilinmiyor . Bu hatanın hangi durumlarda döndürüldüğü yukarıda belirtilmiştir. GetLastError() işlevi OrderModify () işlevinden sonra çağrılırsa, bir hata kodu ( yani siparişin değiştirilmemesinin nedeni ) veya 0 (başarılı değişiklik olması durumunda ) döndürür. ticaret emrinin yerine getirildiğini.

 
TarasBY :

Genel olarak, evet. Eğer "yaşlılık" seçeneğini kullanırsanız (ben kullanırım), o zaman bir döngü çalıştırmanız gerekir: önce, son açık SATIN AL pozisyonunu bulun, ardından biletle silin ve gerektiği kadar tekrarlayın.

PS AL ve SATIŞ için ayrı ayrı işlevler yazmak başlangıçta bir değişkendir (IMHO).

Ve bu durumda işlev çok daha karmaşık görünmeyecek:


Teşekkürler, inceleyeceğim.