[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 718

 
Roger :
Dosyayı satır satır okuyun ve her seferinde değişkenlerinize değerler atayın. Dosya sona erdiğinde, değişkenler son değerlerine sahip olacaktır.

Nasıl uygulanır?

Ne kullanacağını çözemiyorum

 
zheleznii :

Nasıl uygulanır?

Ne kullanacağını çözemiyorum


    Bu konuda zaten çok şey yazıldı ve yeniden yazıldı, bunu deneyin https://www.mql5.com/ru/forum/118349
     

    Ve tekrar iyi geceler! Çok uzun zaman önce, bir para biriminde olmak, diğerlerinde siparişleri açan ve takip uygulamasında bir sorunla karşılaşan çok para birimli bir Uzman Danışman yazmaya başladım.

    En yakındaki trolü uzmandan söküp akıllanmaya başladım ama hiçbir şey olmuyor. İşte kod:

     // ну так сообственно вызываю функцию - TrailingStop();
    //вот что в функции
     void TrailingStop()
    { 
       if (TrailingStop<MinStop) return ; 
       int ask, bid, open, stop, level; 
       for ( int i= 0 ; i< OrdersTotal (); i++) 
          { 
          if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) break ; 
          if (OrderSymbol()!= Symbol ()) continue ; 
          if (OrderType()==OP_BUY) 
             { 
             bid= MathRound (Bid/ Point ); 
             open= MathRound (OrderOpenPrice()/ Point ); 
             stop= MathRound (OrderStopLoss()/ Point ); 
             level=bid-TrailingStop; 
             if (level<open || level>bid-MinStop) continue ; 
             if (stop> 0 && stop>=level) continue ; 
             OrderModify(OrderTicket(),OrderOpenPrice(),level* Point ,OrderTakeProfit(), 0 , White ); 
             Print ( "трал сдвинут" );
             //ShowError(); 
             } 
          if (OrderType()==OP_SELL) 
             { 
             ask= MathRound (Ask/ Point ); 
             open= MathRound (OrderOpenPrice()/ Point ); 
             stop= MathRound (OrderStopLoss()/ Point ); 
             level=ask+TrailingStop; 
             if (level>open || level<ask+MinStop) continue ; 
             if (stop> 0 && stop<=level) continue ; 
             OrderModify(OrderTicket(),OrderOpenPrice(),level* Point ,OrderTakeProfit(), 0 , White ); 
             //ShowError(); 
             Print ( "трал сдвинут" );
             } 
          } 
    }

    ve işte çözemediğim şey. Danışman bir karikatür olduğu için, para birimleri için öngörülemeyen bir şekilde emirler açar ve aynı anda birkaç para biriminde olur.

    Takip eden kodda, ( int i= 0 ; i< OrdersTotal (); i++) için açık siparişler sayılır ve ardından OrderSelect siparişi seçilir, vb., belirli bir çift için her açık sipariş için değişikliklerin alınması gerektiğini anlıyorum. teklif ver, verileri iyi sor, vb. pürüz burada, ancak işlev hangi para biriminden hangi verileri indireceğini ve değişiklik sırasını nasıl seçeceğini nasıl bulabilir? Kafamda tek bir seçenek var, en kötüsü her para birimi için bir sonda yazmak) . bana ne yapılabileceğini söyle. Anladığım kadarıyla, bu sadece takip için geçerli değil, aynı zamanda bir siparişi kapatma işlevine de eşdeğer.

     
    Infinity :

    Ve tekrar iyi geceler! Çok uzun zaman önce, bir para biriminde olmak, diğerlerinde siparişleri açan ve takip uygulamasında bir sorunla karşılaşan çok para birimli bir danışman yazmaya başladım.

    En yakındaki trolü uzmandan söküp akıllanmaya başladım ama hiçbir şey olmuyor. İşte kod:

    ve işte çözemediğim şey. Danışman bir karikatür olduğu için, para birimleri için öngörülemeyen bir şekilde emirler açar ve aynı anda birkaç para biriminde olur.

    Takip eden kodda, ( int i= 0 ; i< OrdersTotal (); i++) için açık siparişler sayılır ve ardından OrderSelect siparişi seçilir, vb., belirli bir çift için her açık sipariş için değişikliklerin alınması gerektiğini anlıyorum. teklif ver, verileri iyi sor, vb. pürüz burada, ancak işlev hangi para biriminden hangi verileri indireceğini ve değişiklik sırasını nasıl seçeceğini nasıl bulabilir? Kafamda tek bir seçenek var, en kötüsü her para birimi için bir sonda yazmak) . bana ne yapılabileceğini söyle. Anladığım kadarıyla, bu sadece takip etmekle ilgili değil, aynı zamanda bir siparişi kapatma işleviyle de eşdeğer.

    Alet sembolünü trol koduna geçirmeyi deneyin. Sonra her çift için bir trol çağıracaksınız.
     void TrailingStop( string sy)
    
    if (sy == "" || sy == "0" ) sy = Symbol();
    
    Peki, sy değerine dayanarak, belirli bir sembolün verilerini diğer değerlere atayın ... Aynı Ask ile Teklif, örneğin ...
     

    Infinity :

    bir şey teknolojiyi tam olarak anlamadı, nasıl çalışacak


     
    Roger :

    Bu konuda zaten çok şey yazıldı ve yeniden yazıldı, bunu deneyin https://www.mql5.com/en/forum/118349

    int a1;

    int tanıtıcı=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
    FileWrite(tanıtıcı, a1);

    FileClose(tutamak);

    a1=5 dosyasında;

    Temel bilgilerde yanlış anlama Lütfen açıklayın - önerileni ekleyin

    int tanıtıcı=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
    burada a1'e 5 değeri atanır

    FileClose(tutamak);

    gerçekten gerekli

     
    Infinity :
    İşleve iletilen çiftin verilerine göre sondaki koddaki değişkenlere değerler atayın. Sondaki kodu bitirmeniz gerekiyor... Örneğin, Bid değişkeni sadece bildirilmemeli,

    ve kendisine atanan bir değerle ilan edildi:

     int ask = MarketInfo(sy, MODE_ASK), bid=MarketInfo(sy, MODE_BID), open, stop, level;

    Sırasıyla

    bid= MathRound (Bid/ Point );

    farklı şekilde yazılmalıdır, örneğin:

    bid= MathRound (MarketInfo(sy, MODE_BID)/ Point );

    Veya başka bir değişken oluşturun, örneğin PriceBid ve yazın

    PriceBid= MathRound (Bid/ Point );

    ve daha sonra kodda Bid yerine PriceBid kullanın...

    Tüm kodunuzu gözden geçirin ve gerektiğinde belirli bir sembol için değişken alıcıları kullanın.
    Ve çağrıldığında bu sembolü trol işlevine ileteceksiniz:

    TrailingStop(EURUSD);     // Тралим ЕвроБаксы
    
    TrailingStop("");         // Тралим символ графика

    veya

    TrailingStop(NULL);         // Тралим символ графика

    Bu daha net mi?

     
    artmedia70 :
    İşleve iletilen çiftin verilerine göre sondaki koddaki değişkenlere değerler atayın. Sondaki kodu bitirmeniz gerekiyor... Örneğin, Bid değişkeni sadece bildirilmemeli,

    ve kendisine atanan bir değerle ilan edildi:

    Sırasıyla

    farklı şekilde yazılmalıdır, örneğin:

    Veya başka bir değişken oluşturun, örneğin PriceBid ve yazın

    ve daha sonra kodda Bid yerine PriceBid'i kullanın...

    Tüm kodunuzu gözden geçirin ve gerektiğinde belirli bir sembol için değişken alıcıları kullanın.
    Ve çağrıldığında bu karakteri trol işlevine geçireceksiniz:

    veya

    Bu daha net mi?





    çok anlaşılır. Hangi döviz çiftinin bana hangi anda transfer edileceğini bulamıyorum. Örneğin, böyle ve böyle çiftler için 4 siparişin açık olduğu ve bu çiftlerin tam olarak ne iletilmesi gerektiği hakkında nereden bilgi alabilirim.

    Doğru şeyi yapıp yapmadığımı bilmiyorum, .. genel olarak ....

    в блоке start  определяю открытые ордера и определяю по каким парам они открыты
     for ( int i= 0 ; i< OrdersTotal (); i++) 
          { 
          if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) break ; 
          if (OrderSymbol()== "EURUSD" ) {sy= "EURUSD" ;MinStop=MarketInfo(sy,MODE_STOPLEVEL); break; }
          if (OrderSymbol()== "GBPUSD" ) {sy= "GBPUSD" ;MinStop=MarketInfo(sy,MODE_STOPLEVEL); break; }
           
          } 
      TrailingStop(sy);
    
    а в функции делаю следующее
    
    void TrailingStop( string sy)
    { 
       if (TrailingStop<MinStop) return ; 
       int ask, bid, open, stop, level,point; 
       for ( int i= 0 ; i< OrdersTotal (); i++) 
          { 
          if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) break ; 
          if (OrderSymbol()==sy)  
          bid=MarketInfo(sy,MODE_BID);
          ask=MarketInfo(sy,MODE_ASK);
          point=MarketInfo(sy,MODE_POINT);
          if (OrderType()==OP_BUY) 
             { 
             bid= MathRound (bid/point); 
             open= MathRound (OrderOpenPrice()/point); 
             stop= MathRound (OrderStopLoss()/point); 
             level=bid-TrailingStop; 
             if (level<open || level>bid-MinStop) continue ; 
             if (stop> 0 && stop>=level) continue ; 
             OrderModify(OrderTicket(),OrderOpenPrice(),level*point,OrderTakeProfit(), 0 , White ); 
             Print ( "трал сдвинут" );
             //ShowError(); 
             } 
          if (OrderType()==OP_SELL) 
             { 
             ask= MathRound (ask/point); 
             open= MathRound (OrderOpenPrice()/point); 
             stop= MathRound (OrderStopLoss()/point); 
             level=ask+TrailingStop; 
             if (level>open || level<ask+MinStop) continue ; 
             if (stop> 0 && stop<=level) continue ; 
             OrderModify(OrderTicket(),OrderOpenPrice(),level*point,OrderTakeProfit(), 0 , White ); 
             //ShowError(); 
             Print ( "трал сдвинут" );
             } 
          } 
    }

    ama bir nedenden dolayı, sonunda EURUSD hatası alıyorum: sıfır bölme - bu hata görünüşe göre 0 değişkeninde bir yerde, muhtemelen bölme gibi bir işlem sırasında diyor. Doğru şekilde uygulamaya çalışıyor muyum?

     
    zheleznii :

    int a1;

    int tanıtıcı=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
    FileWrite(tanıtıcı, a1);

    FileClose(tutamak);
    a1=5 dosyasında;

    Temel bilgilerde yanlış anlama Lütfen açıklayın - önerileni ekleyin

    int tanıtıcı=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
    burada a1'e 5 değeri atanır

    FileClose(tutamak);

    gerçekten gerekli

    Yani, sırayla.

    Yalnızca en son verilere ihtiyaç duyuluyorsa, neden öncekileri kaydedelim? ("yazmadan önce", FILE_READ|FILE_WRITE modlarının bir kombinasyonu ile oluşur).
    O yüzden kullanmak daha mantıklı FILE_CSV|FILE_WRITE modu, yeni veriler yazılmadan önce önceki kayıtların silindiği mod.

    Bir dosyaya 4 değişken yazmaya başlıyoruz.

     //+------------------------------------------------------------------+
    int start(){
       int handle;
       int a1 = 3 ;
       double punkt = 0.4 ;
       double nn = 1128 ;
       double mm = 1000 ;
    
       handle= FileOpen ( "a1.csv" , FILE_CSV | FILE_WRITE , ';' );
       FileWrite (handle,a1,punkt,nn,mm);
       FileClose (handle);           
    }
    //+------------------------------------------------------------------+

    Hatırlanması gereken en önemli şey, değişkenlerin yazıldığı sıradır, çünkü onları aynı sırayla okuyacağız.

    Verileri bir dosyadan değişkenlere okumaya başlıyoruz.

     //+------------------------------------------------------------------+
    int start(){
       int handle;
       int a;
       double p;
       double n;
       double m;   
       handle= FileOpen ( "a1.csv" , FILE_CSV | FILE_READ , ';' );         
       
       a = FileReadNumber (handle);    //считываем первую цифру, соответствующую переменной a1 и далее по порядку...
       p = FileReadNumber (handle);    //punkt
       n = FileReadNumber (handle);    //nn
       m = FileReadNumber (handle);    //mm
       
       FileClose (handle);           
    }
    //+------------------------------------------------------------------+

    FileReadNumber () fonksiyonunu kullanarak, yazdığımız sırayla, basamak basamak sırayla okuruz.
    Aslında, hepsi bu, karmaşık bir şey yok :)

     
    Infinity :


    çok anlaşılır. Hangi döviz çiftinin bana hangi anda transfer edileceğini bulamıyorum. Örneğin, böyle ve böyle çiftler için 4 siparişin açık olduğu ve bu çiftlerin tam olarak ne iletilmesi gerektiği hakkında nereden bilgi alabilirim.

    Doğru şeyi yapıp yapmadığımı bilmiyorum, .. genel olarak ....

    ama bir nedenden dolayı, sonunda EURUSD hatası alıyorum: sıfır bölme - bu hata görünüşe göre 0 değişkeninde bir yerde, muhtemelen bölme gibi bir işlem sırasında diyor. Doğru şekilde uygulamaya çalışıyor muyum?

    Değişkenlere her değer atama işleminden sonra veya her bölme işleminden önce sıfırla nerede karşılaştığınızı belirlemek için bir çıktı alın ve bundan dans edin.