Izgara oluşturucu 1.1 - sayfa 4

 
üzgünüm cori, herhangi bir ızgara konumu için yalnızca bir siparişim var ve hemen hemen tüm varyasyonları test ettim - birkaç haftadan beri.

MT4 arkadaşlarımız üzülmesin diye ara sıra tüm açık siparişleri siliyorum.

Bu sorunu geri testte alacaksınız ama bu bir komut dosyası sorunu değil .. MT4 geriye dönük test sorunu.

Devam ederse, lütfen bana bildirin veya sorunu gösteren bazı raporlar gönderin...

teşekkürler ve saygılar,

sarılmak
 
Onu buldum. Ve bu konuda eğlenmiyorum.

Danışman, verdiğim yorum "GridEURUSD" ile ızgarayı oluşturuyor. Bu yorum, sipariş beklediği sürece Yorum Alanında kalır. Sipariş etkinleştirilirse, yorum "etkinleştir/otomatik" olarak değişir. Sonuçta, bu davranışın açıklanan soruna yol açtığı açıktır.

Alpari ile ticaret yapıyorum. Demo hesaplarda MT4'ü destekliyorlar

Bu davranışı, yani sıranın büyüsünü ızgara için tanımlayıcı olarak kullanıp kullanamayacağımı kontrol edeceğim ve sonuçları size bildireceğim.

Bunu test ederken, ızgara için temizleme komut dosyasında da değişiklikler yaptım. Açık siparişleri kapatmak için de işlevsellik ekledim. Ne yazık ki, açık bir siparişi kapatmaya çalışırsam, Sipariş kilitli anlamına gelen 129 hatası alıyorum. Ancak verilen ızgara için bekleyen tüm siparişleri siler.

//+------------------------------------------- -------------------+
//| RemoveGrid.mq4 |
//| Telif hakkı © 2005, hdb |
//| http://www.dubois1.net/hdb |
//+------------------------------------------- -------------------+
#property telif hakkı "Telif hakkı © 2005, hdb"
#özellik bağlantısı "http://www.dubois1.net/hdb"

harici string GridName = "Izgara";
extern bool closeOpen = false;

//+------------------------------------------- -------------------+
//| komut dosyası programı başlatma işlevi |
//+------------------------------------------- -------------------+
int başlangıç()
  {
 
 
 #property show_inputs // parametreleri gösterir - teşekkürler Slawa... 

//---- 
  int toplam = SiparişlerToplam();
  int ;
  
      for(i=toplam-1; i>=0;i--)
 
      {
        OrderSelect(i, SELECT_BY_POS);
        int türü = OrderType();

        if ( OrderSymbol()==Symbol() && OrderComment() == GridName )
        {
          bool sonucu = yanlış;
    
          anahtar (tip)
          {
            durum OP_BUY : if (kapatAç) {
                                    sonuç = OrderClose( OrderTicket(), OrderLots(), Ask, 0, Blue );
                                }
                                kırmak;
            durum OP_SELL : if (kapatAç) {
                                    sonuç = OrderClose( OrderTicket(), OrderLots(), Bid, 0, Blue );
                                }
                                kırmak;
            //Bekleyen siparişleri kapat
            durum OP_BUYLIMIT : sonuç = OrderDelete( OrderTicket() );
                                kırmak; 
            durum OP_BUYSTOP : sonuç = OrderDelete( OrderTicket() ); 
                                kırmak; 
            durum OP_SELLLIMIT : sonuç = OrderDelete(OrderTicket()); 
                                kırmak; 
            durum OP_SELLSTOP : sonuç = OrderDelete(OrderTicket()); 
                                kırmak; 
          }
    
          if(sonuç == yanlış)
          {
            Print("Order " , OrderTicket() , " kapatılamadı. Hata:" , GetLastError() );
     // Uyku(3000);
          }  
        }
      }
 
//----
   dönüş(0);
  }
//+------------------------------------------- -------------------+




kori

 
tamam kori teşekkürler..

işe yararsa bana haber ver ve sihri kullanacağım.. çünkü komisyoncunun böyle garip şeyler yaptığının farkında değildim!!

teşekkürler ve saygılar,

sarılmak
 
Şimdi, bu kadar.

gridMaker'ı yorum yerine OrderMagicNumber kullanacak şekilde değiştirdim. Ayrıca yorumu oluşturma konusunda bazı küçük değişiklikler yaptım.

İşte sonuç.

//+------------------------------------------- -------------------+
//| MakeGrid.mq4 |
//| Telif hakkı © 2005, hdb |
//| http://www.dubois1.net/hdb |
//+------------------------------------------- -------------------+
#property telif hakkı "Telif hakkı © 2005, hdb"
#özellik bağlantısı "http://www.dubois1.net/hdb"
//#özellik sürümü "1.4beta"

// cori tarafından değiştirildi. Şebekenin işlemlerini belirlemek için OrderMagicNumber'ı kullanma
harici int uniqueGridMagic = 11111; // İşlemlerin sihirli numarası. tanımlamak için benzersiz olmalıdır
                                         // bir ızgaranın işlemleri    
dış çift Lot = 0.1; // 
dış çift GridSize = 6; // siparişler arasındaki pip - ızgara veya ağ boyutu
harici çift GridSteps = 12; // verilecek toplam sipariş sayısı
harici çift TakeProfit = 6 ; // kar elde etmek için tik sayısı. normalde = ızgara boyutudur, ancak geçersiz kılabilirsiniz
harici çift StopLoss = 0; // eğer bir stoploss eklemek istiyorsanız. normal şebekeler durdurma kayıplarını kullanmaz
harici çift UpdateInterval = 1; // siparişleri her x dakikada bir güncelle
extern bool wantLongs = true; // uzun pozisyonlar istiyor muyuz
extern bool wantShorts = true; // kısa pozisyonlar istiyor muyuz
extern bool istiyorBreakout = true; // uzunları fiyatın üstünde, şortları fiyatın altında mı istiyoruz
extern bool requestCounter = true; // uzunları fiyatın altında, şortları fiyatın üstünde mi istiyoruz
harici bool limitiEMA34 = yanlış; // uzunları sadece ema'nın üstünde, şortları sadece ema'nın altında mı istiyoruz

// cori tarafından değiştirildi. sadece dahili değişkenler
çift LastUpdate = 0; // son güncellemenin zamanını not etmek için kullanılan sayaç
çift GridMaxOpen = 0; // maksimum açık pozisyon sayısı
string GridName = "Izgara"; // ızgarayı tanımlar. birlikte var olan birkaç ızgaraya izin verir
//+------------------------------------------- -------------------+
//| uzman başlatma işlevi |
//+------------------------------------------- -------------------+
int init()
  {
//---- 
 #property show_inputs // parametreleri gösterir - teşekkürler Slawa...    
 if ( TakeProfit <= 0 ) // 
   { TakeProfit = GridSize; }
//----
   GridName = StringConcatenate("Izgara", Symbol());
   dönüş(0);
  }
//+------------------------------------------- -------------------------+
//| atRate | bölgesinde açık bir pozisyon veya emir olup olmadığını test eder.
//| checkLongs doğruysa uzunları kontrol eder, aksi takdirde kontrol eder |
//| şortlar için |
//+------------------------------------------- -------------------------+

bool IsPosition(double atRate, double inRange, bool checkLongs )
  {
  
     int toplam siparişler = SiparişlerToplam();
     for(int j=0;j<totalorders;j++) // tüm emirleri ve pozisyonları tara...
      {
        OrderSelect(j, SELECT_BY_POS);
        // cori tarafından değiştirildi. Şebekenin işlemlerini belirlemek için OrderMagicNumber'ı kullanma
        if ( OrderSymbol()==Symbol() && OrderMagicNumber() == uniqueGridMagic ) // sadece mygrid ve sembolün olup olmadığına bakın...
         { int type = OrderType();
            if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // tam fiyatı değil fiyat yakınlığını arayın (ızgara boyutundan küçük)
              { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) ) || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP ) ) )
                 { 
                    dönüş(doğru); 
                 }
              }
         }
      } 

   dönüş(yanlış);
  }
//+------------------------------------------- -------------------+
//| komut dosyası programı başlatma işlevi |
//+------------------------------------------- -------------------+
int başlangıç()
  {
//---- 
   int i, j,k, bilet, entermode, toplam siparişler;
   bool doit;
   çift nokta, başlangıç oranı, ticaret oranı;
 
//----
  if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // ilk çağrıldığında ve her UpdateInterval dakikasında güncelliyoruz
   {
   LastUpdate = CurTime();
   Print("Güncelleniyor");
   nokta = MarketInfo(Symbol(),MODE_POINT);
   başlangıç hızı = ( Sor + nokta*GridSize/2 ) / nokta / GridSize; // GridSize tarafından bölünebilen bir dizi onay işaretine yuvarlama
   k = başlangıç hızı;
   k = k * IzgaraBoyutu ;
   başlangıç hızı = k * nokta - GridSize*GridSteps/2*point ; // en düşük giriş noktasını hesapla
   
   double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0);
   
   for( i=0;i<GridSteps;i++)
   {
     ticaret oranı = başlangıç hızı + i*nokta*GridSize;
     
     if ( wantLongs && (!limitEMA34 || ticari işlem > EMA34))
       {
         if ( IsPosition(traderate,point*GridSize,true) == false ) // fiyatıma yakın açık emrim olup olmadığını test edin: öyleyse, bir tane koyun
          {
            çift myStopLoss = 0;
             if (StopLoss > 0 )
               { myStopLoss = ticaret oranı noktası*StopLoss ; }
               
             if ( takas > Sor ) 
              { entermode = OP_BUYSTOP; } 
              başka 
              { entermode = OP_BUYLIMIT; } 
              
              if ( ((traderate > Sor ) && (wantBreakout)) || ((traderate <= Ask ) && (wantCounter)) ) 

              { 
                  // cori tarafından değiştirildi. Şebekenin işlemlerini belirlemek için OrderMagicNumber'ı kullanma
                  bilet=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,uniqueGridMagic,0,Green); 
   
             }
          }
       }

     if ( wantShorts && (!limitEMA34 || ticaret oranı < EMA34))
       {
         if (IsPosition(traderate,point*GridSize,false)== false ) // fiyatıma yakın açık siparişim olup olmadığını test edin: öyleyse, bir tane koyun
          {
             myStopLoss = 0;
             if (StopLoss > 0 )
               { myStopLoss = ticaret oranı+puan*StopLoss ; }
             if ( ticaret > Teklif ) 
              { entermode = OP_SELLLIMIT; } 
              başka 
              { entermode = OP_SELLSTOP ; } 
              
              if ( ((traderate < Bid ) && (wantBreakout)) || ((traderate >= Bid ) && (wantCounter)) ) 
               {    
                  // cori tarafından değiştirildi. Şebekenin işlemlerini belirlemek için OrderMagicNumber'ı kullanma
                  bilet=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,uniqueGridMagic,0,Red); }
          }
       }

    }
   }
   dönüş(0);
  }
//+------------------------------------------- -------------------+



saygılarımla, cori

 
teşekkürler kori...

Kendimde birkaç değişiklik yaptığım için, değişikliklerinizi daha yeni sürüme entegre ettim.

1 küçük değişiklik yaptım: mevcut ızgaralarımı aktif tutmak için büyü VEYA ızgara adı üzerinde bir test yaptım ...

doğru yapıp yapmadığımı kontrol edebilir misin?



//+------------------------------------------- -------------------+
//| MakeGrid.mq4 |
//| Telif hakkı © 2005, hdb |
//| http://www.dubois1.net/hdb |
//+------------------------------------------- -------------------+
#property telif hakkı "Telif hakkı © 2005, hdb"
#özellik bağlantısı "http://www.dubois1.net/hdb"
//#özellik sürümü "1.6beta"

// cori tarafından değiştirildi. Şebekenin işlemlerini belirlemek için OrderMagicNumber'ı kullanma
harici int uniqueGridMagic = 11111; // İşlemlerin sihirli numarası. tanımlamak için benzersiz olmalıdır
                                         // bir ızgaranın işlemleri    
harici çift Lot = 0.1; // 
dış çift GridSize = 6; // siparişler arasındaki pip - ızgara veya ağ boyutu
harici çift GridSteps = 12; // verilecek toplam sipariş sayısı
harici çift TakeProfit = 12 ; // kar elde etmek için tik sayısı. normalde = ızgara boyutudur, ancak geçersiz kılabilirsiniz
harici çift StopLoss = 0; // eğer bir stoploss eklemek istiyorsanız. normal şebekeler durdurma kayıplarını kullanmaz
harici çift UpdateInterval = 1; // siparişleri her x dakikada bir güncelle
extern bool wantLongs = true; // uzun pozisyonlar istiyor muyuz
extern bool WantShorts = false; // kısa pozisyonlar istiyor muyuz
extern bool istiyorBreakout = true; // uzunları fiyatın üstünde, şortları fiyatın altında mı istiyoruz
extern bool requestCounter = true; // uzunları fiyatın altında, şortları fiyatın üstünde mi istiyoruz
harici bool limitiEMA34 = true; // uzunları sadece ema'nın üstünde, şortları sadece ema'nın altında mı istiyoruz
harici çift GridMaxOpen = 0; // maksimum açık pozisyon sayısı : henüz uygulanmadı..
harici bool UseMACD = true; // true ise, yalnızca uzunlar için macd >0, yalnızca şortlar için macd >0 kullanılır
                                       // geçişte, bekleyen tüm siparişleri iptal edecek. Bu, herhangi bir
                                       // wantLongs ve wantShort ayarları - en azından şimdilik.
extern bool CloseOpenPositions = false;// UseMACD ise, açık pozisyonları da kayıpla kapatıyor muyuz?

// cori tarafından değiştirildi. sadece dahili değişkenler
string GridName = "Izgara"; // ızgarayı tanımlar. birlikte var olan birkaç ızgaraya izin verir
çift LastUpdate = 0; // son güncellemenin zamanını not etmek için kullanılan sayaç

//+------------------------------------------- -------------------+
//| uzman başlatma işlevi |
//+------------------------------------------- -------------------+
int init()
  {
//---- 
 #property show_inputs // parametreleri gösterir - teşekkürler Slawa...    
 if ( TakeProfit <= 0 ) // 
   { TakeProfit = GridSize; }
//----
// corri'mi ekledim ve hdb tarafından kaldırıldı!! lol .. sadece açık ızgaralarla uyumlu kalmak için ...
// GridName = StringConcatenate( "Izgara", Symbol() );
   dönüş(0);
  }
//+------------------------------------------- -------------------------+
//| atRate | bölgesinde açık bir pozisyon veya emir olup olmadığını test eder.
//| checkLongs doğruysa uzunları kontrol eder, aksi takdirde kontrol eder |
//| şortlar için |
//+------------------------------------------- -------------------------+

bool IsPosition(double atRate, double inRange, bool checkLongs )
  {
  
     int toplam siparişler = SiparişlerToplam();
     for(int j=0;j<totalorders;j++) // tüm emirleri ve pozisyonları tara...
      {
        OrderSelect(j, SELECT_BY_POS);
// cori tarafından değiştirildi. Uyumluluk için ızgara // hdb eklenmiş veya ızgara adının işlemlerini tanımlamak için OrderMagicNumber'ı kullanma
        if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // sadece mygrid ve sembolün olup olmadığına bakın...
         { int type = OrderType();
            if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // tam fiyatı değil fiyat yakınlığını arayın (ızgara boyutundan daha az)
              { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) ) || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP ) ) )
                 { 
                    dönüş(doğru); 
                 }
              }
         }
      } 
   dönüş(yanlış);
  }

//+------------------------------------------- -------------------------+
//| bekleyen tüm siparişleri iptal eder |
//+------------------------------------------- -------------------------+

void CloseAllPendingOrders()
  {
     int toplam siparişler = SiparişlerToplam();
     for(int j=totalorders-1;j>=0;j--) // tüm emirleri ve pozisyonları tara...
      {
        OrderSelect(j, SELECT_BY_POS);
// cori'ye göre değiştirildi. Uyumluluk için ızgara // hdb eklenmiş veya ızgara adının işlemlerini tanımlamak için OrderMagicNumber'ı kullanma
        if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // sadece mygrid ve sembolün olup olmadığına bakın...
         {  
          int türü = OrderType();
          bool sonucu = yanlış;
          anahtar (tip)
          {
             durum OP_BUY : sonuç = doğru ;
             durum OP_SELL : sonuç = doğru ;
            //Bekleyen siparişleri kapat
            durum OP_BUYLIMIT : sonuç = OrderDelete( OrderTicket() ); 
            durum OP_BUYSTOP : sonuç = OrderDelete( OrderTicket() ); 
            durum OP_SELLLIMIT : sonuç = OrderDelete(OrderTicket()); 
            durum OP_SELLSTOP : sonuç = OrderDelete(OrderTicket()); 
          }
         }
      } 
   dönüş;
  }


//+------------------------------------------- -------------------------+
//| bekleyen tüm emirleri iptal eder ve açık pozisyonları kapatır |
//+------------------------------------------- -------------------------+

geçersiz CloseOpenOrders()
{
  int toplam = SiparişlerToplam();
  for(int i=toplam-1;i>=0;i--)
 {
    OrderSelect(i, SELECT_BY_POS);
    int türü = OrderType();
    bool sonucu = yanlış;
// cori tarafından değiştirildi. Uyumluluk için ızgara // hdb eklenmiş veya ızgara adının işlemlerini tanımlamak için OrderMagicNumber'ı kullanma
    if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // sadece mygrid ve sembolün olup olmadığına bakın...
     {
// Print("2 Kapanış",type);
        anahtar (tip)
         {
           //Açılan uzun pozisyonları kapat
           durum OP_BUY : sonuç = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
                               kırmak;
           //Açılan kısa pozisyonları kapat
           durum OP_SELL : sonuç = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
                               kırmak;
           //Bekleyen siparişleri kapat
           durum OP_BUYLIMIT :
           durum OP_BUYSTOP :
           durum OP_SELLLIMIT :
           durum OP_SELLSTOP : sonuç = OrderDelete(OrderTicket());
         }
      }
    if(sonuç == yanlış)
    {
 // Alert("Order " , OrderTicket() , " kapatılamadı. Hata:" , GetLastError() );
 // Uyku(3000);
    }  
  }
  dönüş;
}

//+------------------------------------------- -------------------+
//| komut dosyası programı başlatma işlevi |
//+------------------------------------------- -------------------+
int başlangıç()
  {
//---- 
   int i, j,k, bilet, entermode, toplam siparişler;
   bool doit;
   çift nokta, başlangıç oranı, ticaret oranı;
//----
  if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // ilk çağrıldığında ve her UpdateInterval dakikasında güncelliyoruz
   {
   LastUpdate = CurTime();
   nokta = MarketInfo(Symbol(),MODE_POINT);
   başlangıç hızı = ( Sor + nokta*GridSize/2 ) / nokta / GridSize; // GridSize tarafından bölünebilen bir dizi onay işaretine yuvarlama
   k = başlangıç hızı;
   k = k * IzgaraBoyutu ;
   başlangıç hızı = k * nokta - GridSize*GridSteps/2*point ; // en düşük giriş noktasını hesapla
   double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0);
   if ( UseMACD ) {
      double Macd0=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
      double Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
      double Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
       if( Macd0>0 && Macd1>0 && Macd2<0) // çapraz
        {
         CloseAllPendingOrders();
         if ( CloseOpenPositions == true ) { CloseOpenOrders(); }
        }
       if( Macd0<0 && Macd1<0 && Macd2>0) // çapraz
        {
         CloseAllPendingOrders();
         if ( CloseOpenPositions == true ) { CloseOpenOrders(); }
        }
       WantLongs = yanlış;
       WantShorts = yanlış;
       if( Macd0>0 && Macd1>0 && Macd2>0) // sıfırın çok üzerinde
        {
         WantLongs = doğru;
        }
       if( Macd0<0 && Macd1<0 && Macd2<0) // sıfırın çok altında
        {
         WantShorts = doğru;
        }
   }
   for( i=0;i<GridSteps;i++)
   {
     ticaret oranı = başlangıç hızı + i*nokta*GridSize;
     if ( wantLongs && (!limitEMA34 || ticari işlem > EMA34))
       {
         if ( IsPosition(traderate,point*GridSize,true) == false ) // fiyatıma yakın açık siparişim olup olmadığını test edin: öyleyse, bir tane koyun
          {
            çift myStopLoss = 0;
             if (StopLoss > 0 )
               { myStopLoss = ticaret oranı noktası*StopLoss ; }
             if ( takas > Sor ) 
              { entermode = OP_BUYSTOP; } 
              başka 
              { entermode = OP_BUYLIMIT; } 
              if ( ((traderate > Sor ) && (wantBreakout)) || ((traderate <= Ask ) && (wantCounter)) ) 
              { 
                  // cori tarafından değiştirildi. Şebekenin işlemlerini belirlemek için OrderMagicNumber'ı kullanma
                 bilet=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,uniqueGridMagic,0,Green); 
             }
          }
       }
     if ( wantShorts && (!limitEMA34 || ticaret oranı < EMA34))
       {
         if (IsPosition(traderate,point*GridSize,false)== false ) // fiyatıma yakın açık siparişim olup olmadığını test edin: öyleyse, bir tane koyun
          {
             myStopLoss = 0;
             if (StopLoss > 0 )
               { myStopLoss = ticaret oranı+puan*StopLoss ; }
             if ( ticaret > Teklif ) 
              { entermode = OP_SELLLIMIT; } 
              başka 
              { entermode = OP_SELLSTOP; } 
              
              if ( ((traderate < Bid ) && (wantBreakout)) || ((traderate >= Bid ) && (wantCounter)) ) 
                { 
                   // cori tarafından değiştirildi. Şebekenin işlemlerini belirlemek için OrderMagicNumber'ı kullanma
                   bilet=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,uniqueGridMagic,0,Red); 
                }
          }
       }
    }
   }
   dönüş(0);
  }
//+------------------------------------------- -------------------+
 
merhaba hdb,

Iyi gorunuyor. Ancak GridName'i extern olarak tanımlamanız gerekir, ki bunu değiştirmiştim, çünkü buna parametre olarak ihtiyacım yoktu.

selamlar, cori
 
DİKKAT GridMaker'ın tüm kullanıcıları - IsPosition işlevinde bir hata var - sonuç, tüm ızgara yuvalarının doldurulmamasıdır.

Satırı değiştirebilirsiniz:

if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // tam fiyatı değil fiyat yakınlığını arayın (ızgara boyutundan küçük)

ile

if (MathAbs( OrderOpenPrice() - atRate ) < (inRange*0.9)) // tam fiyatı değil fiyat yakınlığını arayın (ızgara boyutundan daha az) - kayan nokta hataları nedeniyle 0.9 eklendi


ve bu sorunu düzeltir.

Rahatsızlık için özür dilerim...

sarılmak
 
merhaba hugues,

Bu Sorun zaten orada mı?

Eski MQL2'de benzer bir şey buldum.

Bu sorunu aşmanın gerçekten kesin yolu şöyle bir şey yapmaktır:

int intOOP = MathRound( OrdeOpenPrice() / Nokta);

tüm çift değişkenleriniz için. O zaman hatasız karşılaştırılabilir tüm düz int değişkenleriniz var.

Açık ve anlaşılır olması için yazması biraz daha fazla ama daha az hatalı.

saygılarımla,

kori
 
Haklısın Cori, bu çok daha şık! Sadece ben tembelim!

Saygılarımızla,
sarılmak
 
İşte GridMaker EA için bir güncelleme. Bu sürümde bende:

1) UseMACD, wantLongs, wantShorts mantığını değiştirdi. Daha önce, useMACD ayarlanmışsa, EA, wnatLongs ve wantShorts bayraklarından bağımsız olarak uzunları ve kısaları alıyordu. Şimdi, useMACD bu bayrakları geçersiz kılmaz, böylece yalnızca useMACD ile uzun veya yalnızca kısa olabilirsiniz.

2) EMA34 limiti ayarlanmışsa, EMA'nın yanlış tarafında açık sipariş olmadığından emin olmak için ek bir kontrol ekledim. Eskiden siparişler EMA'nın çok üstüne veya altına yerleştirildi, ancak birkaç saat sonra EMA taşındı.. yani EMA'nın her iki tarafında da siparişler vardı.

3) OrderType() üzerindeki switch ifadesinde bir hata var gibi görünüyor. Ne olduğundan emin değilim ama gerçekten komik davranıyor. Sadece switch deyimlerini kaldırdım ve yerine "if" koydum... hoşuma gitmedi ama işe yarıyor!

4) EMA periyodu değişkenini yaptım... geriye dönük test için güzel ..

Birisi isterse birkaç eşlik eden komut dosyam da var:

1) bir çift için doldurulmamış açık siparişleri kaldırmak için
2) tek seferde tüm çiftler için tüm açık siparişleri kaldırmak için
3) tüm pozisyonları kapatmak ve açık emirleri kaldırmak.
4) açık pozisyonlardan ve geçmişten şebeke davranışı hakkında bazı basit istatistikler elde etmek.

İşte V1.08'in kodu:


//+------------------------------------------- -------------------+
//| MakeGrid.mq4 |
//| Telif hakkı © 2005, hdb |
//| http://www.dubois1.net/hdb |
//+------------------------------------------- -------------------+
#property telif hakkı "Telif hakkı © 2005, hdb"
#özellik bağlantısı "http://www.dubois1.net/hdb"
//#özellik sürümü "1.8"
// SORUMLULUK REDDİ ***** ÖNEMLİ NOT ***** KULLANMADAN ÖNCE OKUYUN ***** 
// Bu uzman danışman, gerçek pozisyonları açıp kapatabilir ve dolayısıyla gerçek işlemler yapabilir ve gerçek para kaybedebilir.
// Bu bir 'ticaret sistemi' değil, işlemleri sabit kurallara göre yerleştiren basit bir robottur.
// Yazarın bu sistemin karlılığı konusunda hiçbir iddiası yoktur ve kullanımını önermez.
// bu EA'nın demo hesaplarındaki test amaçları dışında.
// Bu sistemin kullanımı ücretsizdir - ancak yeniden satamazsınız - ve herhangi bir garantisi yoktur.
// herhangi bir amaç için uygunluk.
// Bu programı kullanarak, programın ne yaptığını anladığınızı ve 
// yazar herhangi bir kayıptan sorumlu değildir.
// Kullanmadan önce, lütfen brokerinizle, sistemlerinin sık yapılan işlemler için uyarlandığını kontrol edin.
// bu uzmanla ilişkili.
// 1.8 değişiklik
// requestLongs ve wantShorts'u yerel değişkenlere dönüştürdük. Önceden, UseMACD'yi true olarak ayarlarsanız, 
// uzunlar ve kısalar yaptı ve sadece wantLongs ve wantShorts bayraklarını görmezden geldi. 
// Şimdi, bu bayraklar göz ardı edilmez.
// EMA34 limiti aşıldığında EMA'nın üstünde veya altında 'yasadışı' açık emirler olup olmadığını kontrol etmek için bir döngü eklendi
// bayrak kullanılır. Bunlar zamanla birikir ve asla kaldırılmaz ve EMA'nın hareket etmesinden kaynaklanır.
// çalışmadığı için switch talimatı kaldırıldı - if ifadeleri ile değiştirildi
// EMA dönem değişkenini yaptı
//
//
// cori tarafından değiştirildi. Şebekenin işlemlerini belirlemek için OrderMagicNumber'ı kullanma
harici int uniqueGridMagic = 11111; // İşlemlerin sihirli numarası. tanımlamak için benzersiz olmalıdır
                                         // bir ızgaranın işlemleri    
dış çift Lot = 0.1; // 
dış çift GridSize = 6; // siparişler arasındaki pip - ızgara veya ağ boyutu
harici çift GridSteps = 12; // verilecek toplam sipariş sayısı
harici çift TakeProfit = 12 ; // kar elde etmek için tik sayısı. normalde = ızgara boyutudur, ancak geçersiz kılabilirsiniz
harici çift StopLoss = 0; // eğer bir stoploss eklemek istiyorsanız. normal şebekeler durdurma kayıplarını kullanmaz
harici çift UpdateInterval = 1; // siparişleri her x dakikada bir güncelle
extern bool wantLongs = true; // uzun pozisyonlar istiyor muyuz
extern bool wantShorts = true; // kısa pozisyonlar istiyor muyuz
extern bool istiyorBreakout = true; // uzunları fiyatın üstünde, şortları fiyatın altında mı istiyoruz
extern bool requestCounter = true; // uzunları fiyatın altında, şortları fiyatın üstünde mi istiyoruz
harici bool limitiEMA = true; // uzunları sadece ema'nın üstünde, şortları sadece ema'nın altında mı istiyoruz
extern int EMAperiod = 34; // EMA'nın uzunluğu daha önce 34 olarak sabitlenmişti.
harici çift GridMaxOpen = 0; // maksimum açık pozisyon sayısı : henüz uygulanmadı..
harici bool UseMACD = true; // true ise, yalnızca uzunlar için macd >0, yalnızca şortlar için macd >0 kullanılır
                                       // geçişte, bekleyen tüm siparişleri iptal edecek. Bu, herhangi bir
                                       // wantLongs ve wantShort ayarları - en azından şimdilik.
extern bool CloseOpenPositions = false;// UseMACD ise, açık pozisyonları da kayıpla kapatıyor muyuz?
extern bool doHouseKeeping = true; // sadece bir test

// cori tarafından değiştirildi. sadece dahili değişkenler
string GridName = "Izgara"; // ızgarayı tanımlar. birlikte var olan birkaç ızgaraya izin verir
çift LastUpdate = 0; // son güncellemenin zamanını not etmek için kullanılan sayaç

//+------------------------------------------- -------------------+
//| uzman başlatma işlevi |
//+------------------------------------------- -------------------+
int init()
  {
//---- 
 #property show_inputs // parametreleri gösterir - teşekkürler Slawa...    
//----
// corri'mi ekledim ve hdb tarafından kaldırıldı!! lol .. sadece açık ızgaralarla uyumlu kalmak için ...
// GridName = StringConcatenate( "Izgara", Symbol() );
   dönüş(0);
  }
//+------------------------------------------- -------------------------+
//| atRate | bölgesinde açık bir pozisyon veya emir olup olmadığını test eder.
//| checkLongs doğruysa uzunları kontrol eder, aksi takdirde kontrol eder |
//| şortlar için |
//+------------------------------------------- -------------------------+

bool IsPosition(double atRate, double inRange, bool checkLongs )
  {
     int toplam siparişler = SiparişlerToplam();
     for(int j=0;j<totalorders;j++) // tüm emirleri ve pozisyonları tara...
      {
        OrderSelect(j, SELECT_BY_POS);
// cori tarafından değiştirildi. Uyumluluk için ızgara // hdb eklenmiş veya ızgara adının işlemlerini tanımlamak için OrderMagicNumber'ı kullanma
        if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // sadece mygrid ve sembol olup olmadığına bakın...
         { int type = OrderType();
            if (MathAbs( OrderOpenPrice() - atRate ) < (inRange*0.9)) // tam fiyatı değil fiyat yakınlığını arayın (ızgara boyutundan daha az) - kayan nokta hataları nedeniyle 0.9 eklendi
              { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) ) || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP ) ) )
                 { 
                    dönüş(doğru); 
                 }
              }
         }
      } 
   dönüş(yanlış);
  }

//+------------------------------------------- -------------------------+
//| bekleyen tüm siparişleri iptal eder |
//+------------------------------------------- -------------------------+

void CloseAllPendingOrders()
  {
     int toplam siparişler = SiparişlerToplam();
     for(int j=totalorders-1;j>=0;j--) // tüm emirleri ve pozisyonları tara...
      {
        OrderSelect(j, SELECT_BY_POS);
// cori'ye göre değiştirildi. Uyumluluk için ızgara // hdb eklenmiş veya ızgara adının işlemlerini tanımlamak için OrderMagicNumber'ı kullanma
        if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // sadece mygrid ve sembol olup olmadığına bakın...
         {  
          int türü = OrderType();
          if ( yazın > 1 ) bool sonuç = OrderDelete( OrderTicket() );
         }
      } 
   dönüş;
  }
//+------------------------------------------- -------------------------+
//| bekleyen tüm emirleri iptal eder ve açık pozisyonları kapatır |
//+------------------------------------------- -------------------------+

geçersiz CloseOpenOrders()
{
  int toplam = SiparişlerToplam();
  for(int i=toplam-1;i>=0;i--)
 {
    OrderSelect(i, SELECT_BY_POS);
    int türü = OrderType();
    bool sonucu = yanlış;
// cori tarafından değiştirildi. Uyumluluk için ızgara // hdb eklenmiş veya ızgara adının işlemlerini tanımlamak için OrderMagicNumber'ı kullanma
    if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // sadece mygrid ve sembol olup olmadığına bakın...
     {
           //Açılan uzun pozisyonları kapat
           if ( type == OP_BUY ) sonuç = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
           //Açılan kısa pozisyonları kapat
           if ( type == OP_SELL ) sonuç = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
           //Bekleyen siparişleri kapat
           if ( yazın > 1 ) sonuç = OrderDelete( OrderTicket() );
      }
  }
  dönüş;
}

//+------------------------------------------- -------------------------+
//| EMA'nın yanlış tarafına düşen tüm açık siparişleri iptal eder |
//+------------------------------------------- -------------------------+

EMA'dan CloseOrders'ı geçersiz kılar (EMAValue'yu ikiye katlayın)
  {
     int toplam siparişler = SiparişlerToplam();
     for(int j=totalorders-1;j>=0;j--) // tüm emirleri ve pozisyonları tara...
      {
        OrderSelect(j, SELECT_BY_POS);
        if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // sadece mygrid ve sembol olup olmadığına bakın...
         {  
          int türü = OrderType();
          bool sonucu = yanlış;
//if (tür > 1) Print(type," ",theEMAValue," ",OrderOpenPrice());
          if ( type == OP_BUYLIMIT && OrderOpenPrice() <= theEMAValue ) sonuç = OrderDelete( OrderTicket() ); 
          if ( type == OP_BUYSTOP && OrderOpenPrice() <= theEMAValue ) sonuç = OrderDelete( OrderTicket() ); 
          if ( type == OP_SELLLIMIT && OrderOpenPrice() >= theEMAValue ) sonuç = OrderDelete( OrderTicket() ); 
          if ( type == OP_SELLSTOP && OrderOpenPrice() >= theEMAValue ) sonuç = OrderDelete( OrderTicket() ); 
         }
      } 
   dönüş;
  }
//+------------------------------------------- -------------------+
//| komut dosyası programı başlatma işlevi |
//+------------------------------------------- -------------------+
int başlangıç()
  {
//---- 
   int i, j,k, bilet, entermode, toplam siparişler;
   bool doit;
   çift nokta, başlangıç oranı, ticaret oranı;
//---- kurulum parametreleri 

 if ( TakeProfit <= 0 ) // 
   { TakeProfit = GridSize; }

 bool myWantLongs = wantLongs;
 bool myWantShorts = wantShorts;

//----

  if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // ilk çağrıldığında ve her UpdateInterval dakikasında güncelliyoruz
   {
   LastUpdate = CurTime();
   nokta = MarketInfo(Symbol(),MODE_POINT);
   başlangıç hızı = ( Sor + nokta*GridSize/2 ) / nokta / GridSize; // GridSize tarafından bölünebilen bir dizi onay işaretine yuvarlama
   k = başlangıç hızı;
   k = k * IzgaraBoyutu ;
   başlangıç hızı = k * nokta - GridSize*GridSteps/2*point ; // en düşük giriş noktasını hesapla
   double myEMA=iMA(NULL,0,EMAperiod,0,MODE_EMA,PRICE_CLOSE,0);
   
   if (limitEMA) 
     {
    if (doHouseKeeping) EMA'dan(myEMA) Siparişleri Kapat;
     }
   eğer (UseMACD )  
     {
      double Macd0=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
      double Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
      double Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
       if( Macd0>0 && Macd1>0 && Macd2<0) // çapraz
        {
         CloseAllPendingOrders();
         if ( CloseOpenPositions == true ) { CloseOpenOrders(); }
        }
       if( Macd0<0 && Macd1<0 && Macd2>0) // çapraz
        {
         CloseAllPendingOrders();
         if ( CloseOpenPositions == true ) { CloseOpenOrders(); }
        }
       myWantLongs = yanlış;
       myWantShorts = yanlış;
       if( Macd0>0 && Macd1>0 && Macd2>0 && wantLongs ) // sıfırın oldukça üzerinde
        {
         myWantLongs = doğru;
        }
       if( Macd0<0 && Macd1<0 && Macd2<0 && wantShorts ) // sıfırın oldukça altında
        {
         myWantShorts = doğru;
        }
   }
   for( i=0;i<GridSteps;i++)
   {
     ticaret oranı = başlangıç hızı + i*nokta*GridSize;
     if ( myWantLongs && (!limitEMA || traderate > myEMA))
       {
         if ( IsPosition(traderate,point*GridSize,true) == false ) // fiyatıma yakın açık siparişim olup olmadığını test edin: öyleyse, bir tane koyun
          {
            çift myStopLoss = 0;
             if (StopLoss > 0 )
               { myStopLoss = ticaret oranı noktası*StopLoss ; }
             if ( takas > Sor ) 
              { entermode = OP_BUYSTOP; } 
              başka 
              { entermode = OP_BUYLIMIT; } 
              if ( ((traderate > Sor ) && (wantBreakout)) || ((traderate <= Ask ) && (wantCounter)) ) 
              { 
                  // cori tarafından değiştirildi. Şebekenin işlemlerini belirlemek için OrderMagicNumber'ı kullanma
                 bilet=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,uniqueGridMagic,0,Green); 
             }
          }
       }
     if ( myWantShorts && (!limitEMA || traderate < myEMA))
       {
         if (IsPosition(traderate,point*GridSize,false)== false ) // fiyatıma yakın açık siparişim olup olmadığını test edin: öyleyse, bir tane koyun
          {
             myStopLoss = 0;
             if (StopLoss > 0 )
               { myStopLoss = ticaret oranı+puan*StopLoss ; }
             if ( ticaret > Teklif ) 
              { entermode = OP_SELLLIMIT; } 
              başka 
              { entermode = OP_SELLSTOP ; } 
              
              if ( ((traderate < Bid ) && (wantBreakout)) || ((traderate >= Bid ) && (wantCounter)) ) 
                { 
                   // cori tarafından değiştirildi. Şebekenin işlemlerini belirlemek için OrderMagicNumber'ı kullanma
                   bilet=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,uniqueGridMagic,0,Red); 
                }
          }
       }
    }
   }
   dönüş(0);
  }
//+------------------------------------------- -------------------+
Neden: