Izgara oluşturucu 1.1

 
İşte 'Grid maker'ın 1.1 versiyonu... bir dizi eşit aralıklı alış veya satış emri oluşturan ve sürdüren bir komut dosyası veya uzman danışman.
Bu sürüm ya bir uzman danışmanın yazısıdır, güncelleme sıklığını değiştirebilir, uzun ve/veya kısaları seçebilirsiniz, vb. açıklama için parametrelere bakın.

Çoğu varyantı test ettiğimi düşünüyorum ama her durumda işe yarayacağının garantisi yok! Eğer dener ve sorun bulursanız bana bildirin.

Bu muhtemelen yayınladığım son sürüm. MT4'ü test etmek için geliştirdim. Gelecek sürümler daha karmaşık olacak, destek ve direnç seviyeleri gibi harici verilere ihtiyaç duyacak, bu yüzden bunları yayınlamak uygun olmayacak.



//+------------------------------------------------------------------+
//|                                                     MakeGrid.mq4 |
//|                                            Copyright © 2005, hdb |
//|                                       http://www.dubois1.net/hdb |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, hdb"
#property link      "http://www.dubois1.net/hdb"
//#property version      "1.1beta"

extern string GridName = "Grid";       // identifies the grid. allows for several co-existing grids
extern double Lots = 0.1;              // 
extern double GridSize = 6;            // pips between orders - grid or mesh size
extern double GridSteps = 10;          // total number of orders to place
extern double UpdateInterval = 15;     // update orders every x minutes
extern bool   wantLongs = true;        //  do we want long positions
extern bool   wantShorts = true;       //  do we want short positions
extern bool   wantBreakout = true;     // do we want longs above price, shorts below price
extern bool   wantCounter = true;      // do we want longs below price, shorts above price
extern bool   limitEMA34 = false;      // do we want longs above ema only, shorts below ema only
extern double LastUpdate = 0;          // counter used to note time of last update
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
 #property show_inputs              // shows the parameters - thanks Slawa...    
//----
   return(0);
  }
//+------------------------------------------------------------------------+
//| test if there is an open position or order in the region of atRate     |
//|     will check for longs if checkLongs is true, else will check        |
//|     for shorts                                                         |
//+------------------------------------------------------------------------+

bool IsPosition(double atRate, double inRange, bool checkLongs )
  {
  
     int totalorders = OrdersTotal();
     for(int j=0;j<totalorders;j++)                                // scan all orders and positions...
      {
        OrderSelect(j, SELECT_BY_POS);
        if ( OrderSymbol()==Symbol() && OrderComment() == GridName )  // only look if mygrid and symbol...
         {  int type = OrderType();
            if (MathAbs( OrderOpenPrice() - atRate) < inRange) // dont look for exact price but price proximity (less than gridsize)
              { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT  || type == OP_BUYSTOP ) )  || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT  || type == OP_SELLSTOP ) ) )
                 { return(true); }
              }
         }
      } 

   return(false);
  }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//---- 
   int    i, j,k, ticket, entermode, totalorders;
   bool   doit;
   double point, startrate, traderate;
 
//----
  if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60)           // we update the first time it is called and every UpdateInterval minutes
   {
   LastUpdate = CurTime();
   Print("Updating");
   point = MarketInfo(Symbol(),MODE_POINT);
   startrate = ( Ask + point*GridSize/2 ) / point / GridSize;    // round to a number of ticks divisible by GridSize
   k = startrate ;
   k = k * GridSize ;
   startrate = k * point - GridSize*GridSteps/2*point ;          // calculate the lowest entry point
   
   double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0);
   
   for( i=0;i<GridSteps;i++)
   {
     traderate = startrate + i*point*GridSize;
     if ( wantLongs && (!limitEMA34 || traderate > EMA34))
       {
         if (!IsPosition(traderate,point*GridSize,true) )           // test if i have no open orders close to my price: if so, put one on
          {
             if ( traderate > Ask ) 
              { entermode = OP_BUYSTOP; } 
              else 
              { entermode = OP_BUYLIMIT ; } 
             if ( (traderate > Ask ) && (wantBreakout) || ((traderate < Ask ) && (wantCounter)) ) 
              { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,0,traderate+point*GridSize,GridName,16384,0,Green); }
          }
       }

     if ( wantShorts && (!limitEMA34 || traderate < EMA34))
       {
         if (!IsPosition(traderate,point*GridSize,false) )           // test if i have no open orders close to my price: if so, put one on
          {
             if ( traderate > Bid ) 
              { entermode = OP_SELLLIMIT; } 
              else 
              { entermode = OP_SELLSTOP ; } 
              
              if ( (traderate < Bid ) && (wantBreakout) || ((traderate > Bid ) && (wantCounter)) ) 
                { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,0,traderate-point*GridSize,GridName,16384,0,Red); }
          }
       }

    }
   }
   return(0);
  }
//+------------------------------------------------------------------+
 
merhaba hdb,

Bu fikri uzun zamandır MoneyTec (Simspeed), ET (ElectricSavant) ve Oanda forumlarında (MarkVH ve Sympatico) takip ediyorum ve foruma gönderdiğiniz ilk betiği geliştirmek için nasıl bir uzman geliştireceğimi düşünüyorum, belki daha hızlı bir şeye ulaşmak için birlikte çalışabiliriz :) İlgileniyorsanız lütfen bana bildirin e-posta adresim artefactodigital@gmail.com

Saygılarımla,
Fernando.

İşte 'Grid maker'ın 1.1 versiyonu... bir dizi eşit aralıklı alış veya satış emri oluşturan ve sürdüren bir komut dosyası veya uzman danışman.
Bu sürüm ya bir uzman danışmanın yazısıdır, güncelleme sıklığını değiştirebilir, uzun ve/veya kısaları seçebilirsiniz, vb. açıklama için parametrelere bakın.

Çoğu varyantı test ettiğimi düşünüyorum ama her durumda işe yarayacağının garantisi yok! Eğer dener ve sorun bulursanız bana bildirin.

Bu muhtemelen yayınladığım son sürüm. MT4'ü test etmek için geliştirdim. Gelecek sürümler daha karmaşık olacak, destek ve direnç seviyeleri gibi harici verilere ihtiyaç duyacak, bu yüzden bunları yayınlamak uygun olmayacak.
 
tamam kulağa hoş geliyor.. e-postama bakın...
 
Bu arada, denemekte, kullanmakta, değiştirmekte özgürsünüz ama lütfen satmayın!

Etkin çalışma koşulu ve onunla yapabileceğiniz herhangi bir ticaret konusunda herhangi bir garanti vermiyorum.
Bu komut dosyası nedeniyle doğrudan veya dolaylı kayıplar için sorumluluk kabul etmiyorum.


Kullanırsanız, lütfen ara sıra geri bildirim gönderin - sonuçlar, ayarlar, hatalar, gözlemler vb.

eğlence
 
tamam, işte başlıyor.. bir büyük piyasa hamlesinden sonra, şebeke ayakta kalır!! İki hafta önce 50k ile bir demo hesabı açtım.
Izgara yapıcıyı test ederken 1k kaybettim ve ardından euro düşüşünden hemen önce varsayılan GridMaker uzmanını 9 döviz çiftine koydum:
EUR/CHF, USD/JPY, GBP/JPY, EUR/GBP, USD/CHF, AUD/USD, GBP/USD, EUR/USD, EUR/JPY.

Izgara aralığı, tüm para birimleri için 6 kene ve 6 tikte TP'dir. 0.1 lot büyüklüğünde yerleştirdim. Her döviz çifti için her 6 tikte uzun VE kısa gittim.
Yenileme, 5 dakikada EUR/USD ve GBP/USD hariç her 15 dakikada bir (yani ızgara her 15 dakikada bir yeniden düzenlendi) idi.

Bakiye 10k (%20), kullanılan marj 13k (%26), serbest marj 26k (%52) ve gerçekleşmemiş p&l -19k.

Euro patlamasının net sonucu (şimdiye kadar) -9k düştüm. Bundan çok daha kötüsünü bekliyordum!

Şebeke, Dengeye günde 600 ila 2000 oranında ekleniyor!

Önümüzdeki hafta bunun nasıl göründüğünü görmek için sabırsızlanıyorum.

Yaşasın ızgara!!
 
Pekala, peki, bir hafta sonra ve ızgara gerçekten bir dayak yedi! Benim hatam çünkü gerekli parti büyüklüğü / ızgara aralığı hesaplamalarını yapmadım
Mevcut öz sermaye ile ne kadar isabet alabileceğini görmek gerekiyordu.

Her neyse, bakiye oldukça iyi gidiyor: Günde 700 ila 1800 artış - bakiye şimdi 65k (49k ile başladı, yani bu +16k)
Kullanılan marj şimdi 15k, mevcut marj 21k - gerektiğinde pozisyon eklemek için hala çok yer var.
Gerçekleşmeyen kar ve zarar -29k olup, geçen haftadan 4 daha kötü olan 13k net zarar verir.

Olumlu yanı, karşı işlemlerden kaçınmak için ayarları değiştirmem (CounterTrade flag false) ve gerçekleşmemiş p&l sabitlenmiş görünüyor.
Tek etapta -36k idi.

Bu ileriye dönük testle ilgili sevdiğim şey, büyük bir isabetle başlaması - geçen haftaki euro düşüşü - bu yüzden şimdi nasıl ve ne zaman olacağını görmek ilginç olacak.
sistem kurtarır. olacağından şüphem yok.

Gelecek hafta sonuçları görmek için sabırsızlanıyorum!!!

not. TP'yi değiştirme ve bir SL ekleme olasılığı olan bir v1.2'ye sahibim. istersen buraya yaz.
 
Bu parçayla epey oynadım. sadece tüm çiftlerde her şeyi varsayılan olarak çalıştırıyorum ..
Performansından çok etkilendiğimi söylemeliyim.

Bununla ilgili tek bir büyük büyük kıkırdama var..

sadece kısa pozisyonlar alalım.. fiyat düştükçe kısa emirler etkinleştirilir.. ancak çoğu zaman fiyat tersine dönmeden önce kısa tarafta 2 emir alabilirsiniz.

yani, kar al , başlatılacak bir sonraki kısa devre ile aynı fiyattadır ve spread yani alış ve satış fiyatlarını hesaba katmaz.

bu nedenle fiyatlar uzun tarafa geri dönmeden önce 2 siparişin açılmasını önlemeye yardımcı olmak için TP'nin bir sonraki kısa sipariş verilirken aynı anda gerçekleşmesi gerekir.

Bunun mümkün olup olmadığını düşünüyorum, şu anda düşüşüm yarı yarıya azaltılabilir..

Sanırım bu konudaki son görüşünüz bu sorunu çözecektir.

Yani yayınlarsanız harika olur...
 
merhaba,

eğlenceli bulmana sevindim.. ben de öyle..

Aynı anda bir TP = ızgara boyutuna sahip olmamın ve bir tersine dönüşte 2 açık pozisyon olma olasılığını ortadan kaldırmamın bir yolu yok.
bu bir yazılım sorunu değil, sadece spreadlerle ilgili.

Bunu teorik olarak tamamen ortadan kaldırmanın tek olasılığı, her seferinde yayılmayı kaybetmektir:
yani, 4 kene spreadiniz varsa 1.2006'da (teklif), TP 1.2000'de (ask) ve 1.1996'da (teklif) kısa gidersiniz.
sadece aralığın 4/10'unu kaybedersiniz.

yeni sürümde, ızgara boyutunu ve TP'yi farklı sayılara ayarlayabilirsiniz, böylece ne olduğunuzu uygulayabilirsiniz.
aranıyor: 4 puanlık bir dağılımınız varsa, ızgarayı 10'a ve TP'yi 6'ya ayarlayın.

dd'yi yarı yarıya azaltacağından emin değilim - ama kesinlikle karınızı önemli ölçüde azaltacaktır.

bana bildirin.

ps.. v1.2 sonraki gönderide
 
işte gridmaker'ın v1.2 sürümü.

tek farklar:
1) İsterseniz isteğe bağlı bir stoploss ekledim. 0 stoploss anlamına gelir, herhangi bir pozitif sayı stoploss anlamına gelir.
Eğer bir gridde stoploss kullanırsan, büyük yapmalısın..
2) ızgara boyutundan farklı bir TP belirtebilirsiniz. darkstonexa , bir önceki gönderide çift 'asılı' pozisyonları ortadan kaldırmak istiyor.
ilk niyetim, ızgara boyutuna göre daha büyük TP'leri denemekti.

bunu uzman danışman klasörüne (C:\Program Files\MetaTrader 4\experts\ gibi bir şey) ve komut dosyaları klasörüne isteğe bağlı bir kopyasını kaydedin
betik olarak istiyorsanız (C:\Program Files\MetaTrader 4\experts\scripts\).

İsterseniz açık şebeke siparişlerini kaldırmak için bir komut dosyam var.. Ayarları değiştirmek istiyorsanız oldukça kullanışlıdır.

NOT: Varsayılan ayarlar son sürümden bu yana değişmiş olabilir. yeniden derlemeden önce tercih ettiğiniz ayarları yaptığınızdan emin olun.

Bir yöneticiye SORU: Belki bu tür şeyleri uzman danışman kitaplığına koymalıyım.. bu doğru mu?

//+------------------------------------------------------------------+
//|                                                     MakeGrid.mq4 |
//|                                            Copyright © 2005, hdb |
//|                                       http://www.dubois1.net/hdb |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, hdb"
#property link      "http://www.dubois1.net/hdb"
//#property version      "1.2beta"

extern string GridName = "Grid";       // identifies the grid. allows for several co-existing grids
extern double Lots = 0.1;              // 
extern double GridSize = 6;            // pips between orders - grid or mesh size
extern double GridSteps = 10;          // total number of orders to place
extern double TakeProfit = 6 ;         // number of ticks to take profit. normally is = grid size but u can override
extern double StopLoss = 0;            // if u want to add a stop loss. normal grids dont use stop losses
extern double UpdateInterval = 15;     // update orders every x minutes
extern bool   wantLongs = true;        //  do we want long positions
extern bool   wantShorts = true;       //  do we want short positions
extern bool   wantBreakout = true;     // do we want longs above price, shorts below price
extern bool   wantCounter = false;      // do we want longs below price, shorts above price
extern bool   limitEMA34 = false;      // do we want longs above ema only, shorts below ema only
extern double LastUpdate = 0;          // counter used to note time of last update
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
 #property show_inputs                  // shows the parameters - thanks Slawa...    
 if ( TakeProfit <= 0 )                 // 
   { TakeProfit = GridSize; }
//----
   return(0);
  }
//+------------------------------------------------------------------------+
//| tests if there is an open position or order in the region of atRate    |
//|     will check for longs if checkLongs is true, else will check        |
//|     for shorts                                                         |
//+------------------------------------------------------------------------+

bool IsPosition(double atRate, double inRange, bool checkLongs )
  {
  
     int totalorders = OrdersTotal();
     for(int j=0;j<totalorders;j++)                                // scan all orders and positions...
      {
        OrderSelect(j, SELECT_BY_POS);
        if ( OrderSymbol()==Symbol() && OrderComment() == GridName )  // only look if mygrid and symbol...
         {  int type = OrderType();
            if (MathAbs( OrderOpenPrice() - atRate) < inRange) // dont look for exact price but price proximity (less than gridsize)
              { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT  || type == OP_BUYSTOP ) )  || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT  || type == OP_SELLSTOP ) ) )
                 { return(true); }
              }
         }
      } 

   return(false);
  }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//---- 
   int    i, j,k, ticket, entermode, totalorders;
   bool   doit;
   double point, startrate, traderate;
 
//----
  if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60)           // we update the first time it is called and every UpdateInterval minutes
   {
   LastUpdate = CurTime();
   Print("Updating");
   point = MarketInfo(Symbol(),MODE_POINT);
   startrate = ( Ask + point*GridSize/2 ) / point / GridSize;    // round to a number of ticks divisible by GridSize
   k = startrate ;
   k = k * GridSize ;
   startrate = k * point - GridSize*GridSteps/2*point ;          // calculate the lowest entry point
   
   double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0);
   
   for( i=0;i<GridSteps;i++)
   {
     traderate = startrate + i*point*GridSize;
     if ( wantLongs && (!limitEMA34 || traderate > EMA34))
       {
         if (!IsPosition(traderate,point*GridSize,true) )           // test if i have no open orders close to my price: if so, put one on
          {
             double myStopLoss = 0;
             if ( StopLoss > 0 )
               { myStopLoss = traderate-point*StopLoss ; }
               
             if ( traderate > Ask ) 
              { entermode = OP_BUYSTOP; } 
              else 
              { entermode = OP_BUYLIMIT ; } 
             if ( (traderate > Ask ) && (wantBreakout) || ((traderate < Ask ) && (wantCounter)) ) 
              { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,16384,0,Green); }
          }
       }

     if ( wantShorts && (!limitEMA34 || traderate < EMA34))
       {
         if (!IsPosition(traderate,point*GridSize,false) )           // test if i have no open orders close to my price: if so, put one on
          {
             myStopLoss = 0;
             if ( StopLoss > 0 )
               { myStopLoss = traderate+point*StopLoss ; }
             if ( traderate > Bid ) 
              { entermode = OP_SELLLIMIT; } 
              else 
              { entermode = OP_SELLSTOP ; } 
              
              if ( (traderate < Bid ) && (wantBreakout) || ((traderate > Bid ) && (wantCounter)) ) 
                { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,16384,0,Red); }
          }
       }

    }
   }
   return(0);
  }
//+------------------------------------------------------------------+
 
Bu harika..

Şu anda sorunun çözümü sadece TP seçeneğine sahip olmak.

Düşüş miktarını fazla tahmin etmiş olabilirim.. ama umarım bir aralığın sonunda 2 sipariş gördüğüm vakaların çoğunu durdurur
her biri 2000 $ + kayıp ile geçmişte kalacak :)

şimdi işe yarayabilecek son şey limitli emirlerde vade sonu seçeneğini ayarlamaktır.
şu anda ayarladınız, böylece süreleri dolmaz..
bu yüzden manuel olarak silmeniz gerekir.

Şu anda yaklaşık 3 günlük ve yakın zamanda gelmesi muhtemel olmayan bir sürü siparişim var..

Peki harika bir çalışma demek istiyorum.. :)
 
belirli bir döviz çifti için tüm açık siparişleri kaldırmak için bir komut dosyası. kod biraz kötü ama işe yarıyor gibi görünüyor..

//+------------------------------------------------------------------+
//|                                                   RemoveGrid.mq4 |
//|                                            Copyright © 2005, hdb |
//|                                       http://www.dubois1.net/hdb |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, hdb"
#property link      "http://www.dubois1.net/hdb"

extern string GridName = "Grid";

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {

 #property show_inputs              // shows the parameters - thanks Slawa... 

//---- 
  int total = OrdersTotal();
  int i ;
  
      for(i=total-1; i>=0;i--)
 
      {
        OrderSelect(i, SELECT_BY_POS);
        int type   = OrderType();

        if ( OrderSymbol()==Symbol() && OrderComment() == GridName )
        {
          bool result = false;
    
          switch(type)
          {
             case OP_BUY       : result = true ;
      
            case OP_SELL      : result = true ;

            //Close pending orders
            case OP_BUYLIMIT  : result = OrderDelete( OrderTicket() ); 
            case OP_BUYSTOP   : result = OrderDelete( OrderTicket() ); 
            case OP_SELLLIMIT : result = OrderDelete( OrderTicket() ); 
            case OP_SELLSTOP  : result = OrderDelete( OrderTicket() ); 
          }
    
          if(result == false)
          {
     //       Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
     //       Sleep(3000);
          }  
        }
      }
 
//----
   return(0);
  }
//+------------------------------------------------------------------+
Neden: