English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Farklı Kıtalardaki Saat Dilimi Farklılıklarına Dayalı Bir Alım Satım Stratejisi Örneği

Farklı Kıtalardaki Saat Dilimi Farklılıklarına Dayalı Bir Alım Satım Stratejisi Örneği

MetaTrader 5Örnekler | 15 Aralık 2021, 09:40
302 0
Vasily
Vasily


Giriş

Biraz boş zamanım vardı ve bu kez bu zamanı piyasaları incelemek ve ekonomik döngülerin ve teknik göstergelerin farklılığını araştırmak için harcayacağım açıktı. Araştırmanın sonuçlarını aşağıdaki Grafik Kontrol Seçenekleri ile Gösterge Oluşturma makalesinde görebilirsiniz. Ancak bunlar yalnızca bulgular değildi! Daha da büyük ölçekte bir olgu buldum, ancak bunu anlamak için dünyamıza saat dilimleri açısından bir göz atalım (Şek. 1).

Şekil 1. Saat dilimleri

Gördüğümüz gibi, gün her ülkede farklı başlıyor ve çeşitli zamanlarla devam ediyor; büyük ve uçsuz bucaksız ülkemizin neredeyse 10 saat dilimine yayıldığını, Atlantik Okyanusu'nun ise yalnızca 6 saat dilimini kapsadığını görüyoruz.

Buradaki şablon nedir? Aşağıdaki ülkelerdeki piyasaların açılma sırasına bakalım: Japonya, Avustralya, Çin, Rusya. Rusya'da görevliler ofislerine ilk gelip alım satım işlemlerine başladıklarında, Asya'da halihazırda akşam olmuştur ve Avrupa seansı açıldığında bunlar zaten kapalıdırlar.

Eğlence burada başlıyor. Piyasa açıldıktan sonra, Avrupalı brokerlar ve riskten korunma fonu yöneticileri varlıklarını piyasaya sürerler ve spekülatif veya yatırımcılarının çıkarları ile eş zamanlı hareket ederler. Hayır, Atlantik Okyanusu'nun daha küçük olmasıyla bağlantılı olarak Chicago'da şafakla başlayan en ilginç kısım için çok erken, Chicago borsa yöneticilerinin alım satım terminallerini açıp sermayelerini yönetmeye başladıkları bir zaman gelir.

Atlantik Okyanusu'nun daha küçük ölçüde olmasıyla bağlantılı olarak şu anda bir duralım. Avrupa seansı henüz sona ermemiştir (Şek. 1). Çalışma gününün 8 saat olduğunu varsayarsak, Londra Chicago'dan 8 saat dilimi ile ayrılır + sigara molaları için 45 dakika olmak üzere bir saat eklersek, bu süreyi 1,30 - 2 saat daha uzatır (daha önce bir ofiste çalışmış olanlar bunu bilir). 

Bu, Avrupalı ve Amerikalı yöneticilerin piyasa varlıklarını kazandığımız zamandır. Bu noktada varlıkların tüm sıfırlarını listelemeye korkuyorum, Avrupalı ve Amerikalı yöneticiler menkul kıymetler borsasının fiyatı için mücadeleye başlıyorlar; bu noktada Şekil 2'de gösterildiği gibi bir olgudur. 

Şekil 2. Piyasa Nabzı

Finansal mücadeleler piyasayı dolduruyor, varlıklar her saniye sahiplerini değiştiriyor, ancak piyasa bu şekilde sonlanmıyor! Bu süre bittikten sonra sakin bir hareket başlar ve mevcut trend doğrultusunda hareket eder. Bu noktada, aralık sınırlarını genişletir ve ardından bir kez daha daraltır ve ana trend yönünde hareket etmeye devam eder.

Eminim piyasa fiyatının yükselebileceğini veya düşebileceğini fark etmişsinizdir fakat bu, her zaman sağa doğru hareket eder.


2. Bir algoritma geliştirmenin birincil yöntemi olarak akış grafikleri

"Başlatma-Durdurma" programının ilk bloğu Şekil 3'te gösterilmiştir:


Şekil 3. "Başlatma-Durdurma" bloğu

Bu blok, programın başlangıcını, bir işlevin başlangıcını ve sonunu veya başlatma ve başlatmadan kaldırma gibi başka bir prosedürü belirtmek için kullanılır. Gözden geçireceğimiz bir sonraki blok "Veri" olarak etiketlenmiştir ve Şekil 4'te gösterilmiştir.


Şekil 4. "Veri" bloğu

"Veri" bloğu, programın başlangıcında belirtilen parametreleri veya MQL5 durumunda çıkış değişkenlerini belirlemek için kullanılır. Bu birim aynı zamanda genel değişkenlerin varış yeri işlevine de hizmet eder.

Daha sonra, yaygın olarak kullanılan bir bloğu ele alacağız (MQL'deki programların %99'u bu yöntemi kullanır); bu, bir döngünün sınırlarını işaretleyen iki parça halinde gösterilir. Şek. 5'i göz önünde bulundurun:

Döngü blokları

Şekil 5. Döngü blokları

İlişkilendirme veya hesaplama gibi süreçler genellikle örnekleri Şekil 6'da gösterilen bu döngüler içinde gerçekleşir.

Eylemler

Şekil 6. Eylemler

Ve mantıksal blokları da unutmamalıyız - Şek. 7'de "çözüm" bloğu gösterilmiştir.


Şekil 7. "Çözüm" bloğu

"Çözüm" bloğu, "yerleştirme sayısına bağlı olan anahtarın" türünün işlecinin içinde yer alıyorsa, ikiden fazla çıkışa sahip olabilir. Bu birim, karşılık gelen sayıda çıkışa sahip olacaktır.

Sonraki blok, iMACD veya iRSA gibi önceden tanımlanmış işlevlerin yanı sıra programda veya kitaplıkta başka bir yerde tanımlanan özel işlevleri başlatır (Şek. 8).


Şekil 8. İşlev

Ve son iki blok, yalnızca hizmet işlevlerini (açıklamalar ve ihlal gibi) uygular (Şek. 9).

Hizmet blokları

Şekil 9. Hizmet blokları

Bunların tümü, bir makine için yazılmış herhangi bir programı tanımlamak için kullanılabilen blok türleridir; hepsi açık, basit ve kullanımı kolaydır. Bunlar, geliştirmenin ilk aşamasında, sistemin zayıf noktalarını da ortaya çıkarır ve bu zayıf noktaları ortadan kaldırmak için yöntemler geliştirirler.

Artık bu yöntem hakkında bilgi sahibisiniz, ancak sizden tam olarak bu şemalara göre hareket etmenizi istemiyorum; yalnızca akış grafiklerinin başlangıç değerinin bilinmesi, bir tür hesaplama yönteminin anlaşılmasını yeterince kolaylaştıracaktır. Bu yöntem, beynimin sol yarıküresine hızla vuran, sağ yarıküreden kaçmaya hazır olan bir fikri hızlı bir şekilde formüle etmeme yardımcı oluyor.

3. Algoritmanın yapısı

Artık, akış grafiği stratejisine dayalı olarak Expert Advisor'ı hazırlamaya geçebiliriz.

İlk blok, giriş parametrelerini isteyecektir. Belirlediğimiz gibi, ana mücadele anını (yani Avrupa piyasaları kapandığında Amerika Birleşik Devletleri'nin açılış seansından 2 saat sonra) beklemek hayati önem arz ediyor. Bunu global saatte yani terminal saatinde izleyeceğiz ve dolayısıyla açılış saatini kendimiz hesaplayacağız.

Ardından, gelecekte optimize etme potansiyeline sahip olan pozisyonların boyutunu ve kar ve zarar düzeylerini belirleriz. Sihirli sayı parametresine, Expert Advisor'ımız tarafından talimatını ve açık alım satım işlemlerini belirlemek için kullanılacağı için özellikle dikkat edilecektir. Daha sonra, pozisyonlarımızın riskini gözlemlerimizle sınırlamak için bir takip eden zarar duydurucu yapacağız.

İhtiyacımız olan bir başka ilginç parametre daha var - piyasalardaki ana paniğin bu iki saat içinde ortaya çıktığını göz önünde bulundurursak, şu anda önemli ekonomik haberlerin varlığını ve bunların bir tehdit oluşturup oluşturmadığını izleyeceğimiz bir güvenlik düzeyi.


Şekil 10. Giriş parametreleri

//--- input parameters
input int      America=16;
input double   Lots=0.1;
input int      TakeProfit=500;
input long     MagicNumber=665;
input int      Limited=600;
input int      TrailingStop=100;

Strateji oluşturmanın bir sonraki bölümüne geçelim.

Seansın çapraz olup olmadığını ve talimatların ayarlanıp ayarlanmadığını belirlememiz gerekiyor. (Şek. 11).

Alım satım zamanı

Şekil 11. Alım satım zamanı

Gördüğünüz gibi, verilen algoritma, giriş parametreleri, tamamlanmış hesaplamalar ve çıkış sonuçları ile kapalı bir programdır. Bu tür mini programlar işlevler olarak adlandırılır ve ana programdan kapsülleme yoluyla korunurlar.

Kapsülleme, programlar veya program bölümleri arasında, diğer Gets' ve Sets' alanlarından geçmelerini önlemek için Get ve Set (get ve set) gibi yöntemlerle ayrılan bir bariyerdir. Bu işlemin özü, değişken adlarının işlevler içinde ve ana program içinde aynı olabileceği gerçeğinde yatmaktadır, ancak Get yöntemi, değişken adına sahip bir hücreden almaya çalıştığında kapsülleme ile karşı karşıya kalacaktır; bu, yalnızca bu işlev veya program için ayrılmış belirli bir bellek hücresi bölgesine erişim sağlayacaktır.

Aynısı Set yöntemi için de geçerlidir, ancak Get'ten farklı olarak. Bu, hücrenin belleğindeki değeri değişkenin adına ayarlar ve program içindeki ve işlev içindeki değişkenlerin adları çakışırsa, kapsülleme Set yönteminin başka bir program veya işlev içindeki değişkenlerin değerlerini atamasına izin vermez.

bool time2trade(int TradeHour,int Number)
  {
   MqlDateTime time2trade;
   TimeTradeServer(time2trade);
   if(time2trade.hour!=TradeHour) return(false);
   time2trade.hour= 0;
   time2trade.min = 0;
   time2trade.sec = 1;
   for(int ii=OrdersTotal()-1;ii>=0;ii--)
     {
      OrderGetTicket(ii);
      long ordmagic=OrderGetInteger(ORDER_MAGIC);
      if(Number==ordmagic) return(false);
     }
   HistorySelect(StructToTime(time2trade),TimeTradeServer());
   for(int ii=HistoryOrdersTotal()-1;ii>=0;ii--)
     {
      long HistMagic=HistoryOrderGetInteger(HistoryOrderGetTicket(ii),ORDER_MAGIC);
      if(Number==HistMagic) return(false);
     }
   return(true);
  }

Gerekli seansı tanımladık ve talimatlar oluşturup oluşturmadığımızı belirledik. Bundan sonraki adımda ne yapılması gerektiğini düşünelim.

Daha önce, büyük dalgalanmaların Amerika Birleşik Devletleri'nin açılış seansından 2 saat sonra meydana geldiğini fark etmiştik. Amerikan seansının açılışından sonra 9 adet on beş dakikalık çubuk elde ediyoruz. Bu dönem için maksimum aralığı buluyoruz ve bunu dikkatlice değerlendiriyoruz; bu varyasyon yeterince büyükse, bu, büyük olasılıkla piyasada geniş çapta bir panik olduğu ve gelecekteki trendleri tahmin etmenin zor olduğu anlamına gelir. Bu nedenle, burada bazı kısıtlamalara ihtiyacımız olacak.

Piyasa durgun olduğunda, seans volatilitesini artıracaktır. Bu bize ana trendden maksimum sapmayı belirleme ve ana trend devam edeceği için işe yarayacak olan talimat tuzaklarını güvenli bir mesafeye yerleştirme fırsatı verecektir. Daha önce de belirttiğimiz gibi, fiyat yükselebilir veya düşebilir, ancak her zaman sağa doğru kayar. (Şek. 12).

Talimat verme algoritması

Şekil 12. Talimat kümesinin algoritması

Program kodunu şekillendirirken, alım satım terminali MetaTrader 5'in son işlemin fiyatına yakın bir talimat ayarlamasına izin vermediğine dikkat edin. Şu anda fiyat yeni bir minimum veya maksimum değer çekiyorsa, güvenilir bir talimat tespiti için son işlem fiyatından minimum mesafeye geri adım atarak pozisyonumuzu koruyacağız. Ayrıca, talimatlarımızın süresini gün sonundan önce belirleyeceğiz; zira daha sonra artık geçerli olmayacaklar.

void OnTick()
  {
//---
   if(time2trade(America+2,MagicNumber))
     {
      int i;
      double Highest = 0;
      double Lowest = 0;
      MqlRates Range[];
      CopyRates(Symbol(),15,0,9,Range);
      Lowest=Range[1].low;
      for(i=0; i<9;i++)
        {
         if(Highest<Range[i].high) Highest=Range[i].high;//MathMax(,Highest);
         if(Lowest>Range[i].low)  Lowest=Range[i].low;
        }
      long StopLevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);
      Highest=Highest+StopLevel*Point();
      // add to the current prices parameters of the minimum distance possible for the setting of orders
      Lowest=Lowest-StopLevel*Point();
      // to ensure the maximum probability of the acceptance of our order 30>

      if((Higest-Lowest)/Point()<Limited)
        {
         MqlTradeRequest BigDogBuy;
         MqlTradeRequest BigDogSell;
         BigDogBuy.action=TRADE_ACTION_PENDING;
         // Set the pending order
         BigDogBuy.magic = MagicNumber;
         BigDogBuy.symbol=Symbol();
         BigDogBuy.price=Highest;
         //Price by which the order will be set
         BigDogBuy.volume=Lots;
         BigDogBuy.sl=Lowest;
         //if the stop loss is not set, then set by the strategy /s39>
         BigDogBuy.tp=Highest+TakeProfit*Point();
         //set the take profit/s41>
         BigDogBuy.deviation=dev;
         //minimum deviation from the requested price, 
         //in other words, by how much the executed price can differ from the specified price
         BigDogBuy.type=ORDER_TYPE_BUY_STOP;
         //order type, which is executed based on the specified price or by a higher than specified price
         //in this case the order is set to a higher or equal amount to the specified price 
         //if the order type was buy_limit, then it would be executed 
         //by the specified price, or prices lower than the specified price
         BigDogBuy.type_filling=ORDER_FILLING_AON;
         //the given parameter demonstrates how the order acts 
         //with partial execution of the scope 
         BigDogBuy.expiration=TimeTradeServer()+6*60*60;
         //by the strategy text the order life span only for the current work day
         //since it has been 2 hours since the opening of the American market, and the work day is 8 hours, we have 8-2 = 6
         BigDogSell.action=TRADE_ACTION_PENDING;

         // Set the pending order
         BigDogSell.magic = MagicNumber;
         BigDogSell.symbol=Symbol();
         BigDogSell.price=Lowest;
         //Price, by which the order will be set
         BigDogSell.volume=Lots;
         BigDogSell.sl=Highest;
         //Stop loss set by the strategy
         BigDogSell.tp=Lowest-TakeProfit*Point();
         //set the take profit
         BigDogSell.deviation=dev;
         //Minimum deviation from the requested price, 
         //in other words, by how much the executed price can differ from the specified price
         BigDogSell.type=ORDER_TYPE_SELL_STOP;
         //order type, which is executed based on the specified price or by a higher than specified price
         //in this case the order is set to a higher or equal amount to the specified price  
         //if the order type was buy_limit, then it would be executed
         //by the specified price, or prices lower than the specified price
         BigDogSell.type_filling=ORDER_FILLING_AON;
         //the given parameter demonstrates how the order acts 
         ///with partial execution of the scope  
         BigDogSell.expiration=TimeTradeServer()+6*60*60;
         //by the strategy text the order life span only for the current work day
         //since it has been 2 hours since the opening of the American market, and the work day is 8 hours, we have 8-2 = 6
         MqlTradeResult ResultBuy,ResultSell;
         OrderSend(BigDogBuy,ResultBuy);
         OrderSend(BigDogSell,ResultSell);
        }
     }

Talimatlar verildi, tuzaklar kuruldu, şimdi pozisyonlarımızın risklerini azaltmakla ilgilenme zamanı; o halde takip eden zarar durdurucu teknolojisini (takip eden zarar durdurucu) uygulayalım.

Pozisyonumuzu belirlemek için Sihirli sayıyı (MagicNumber) kullanacağız ve minimum fiyat değişiklikleri ile belirli bir kar düzeyine ulaştığında zararı durdur düzeyini değiştireceğiz.(Şekil 13).

Takip eden zarar durdurucuyu uygulama

Şekil 13. Takip eden zarar durdurucuyu uygulama

Farklı stratejiler için, takip eden zarar durdurucu en basit yöntem kullanılarak uygulanır, ancak bazı stratejilerde fiyatın hedefine ulaşmasını engellememek için takip eden zarar durdurucu kullanılmaması veya böyle bir mekanizmanın yalnızca pozisyonların kayıpsız olarak aktarılması için kullanılması önerilir. Ancak bu stratejide, fiyat kayması durumunda koruyucu durdurmayı belirli sayıda minimum fiyat değişikliği yönümüzde hareket ettirmek için klasik mekanizmayı uyguluyoruz.

//--- trailing implementation
   int PosTotal=PositionsTotal();
   for(int i=PosTotal-1; i>=0; i--)
     {
      //--- go through open positions and see if there are positions created by this Expert Advisor.
      if(PositionGetSymbol(i)==Symbol())
        {
         if(MagicNumber==PositionGetInteger(POSITION_MAGIC))
           {
            MqlTick lasttick;
            SymbolInfoTick(Symbol(),lasttick);
            if(PositionGetInteger(POSITION_TYPE)==0)
              { //--- buy
               if(TrailingStop>0
                  &&(((lasttick.bid-PositionGetDouble(POSITION_PRICE_OPEN))/Point())>TrailingStop)
                  && ((lasttick.bid-PositionGetDouble(POSITION_SL))/Point())>TrailingStop)
                 {
                  MqlTradeRequest BigDogModif;
                  ZeroMemory(BigDogModif);
                  BigDogModif.action= TRADE_ACTION_SLTP;
                  BigDogModif.symbol= Symbol();
                  BigDogModif.sl = lasttick.bid - TrailingStop*Point();
                  BigDogModif.tp = PositionGetDouble(POSITION_TP);
                  BigDogModif.deviation=3;
                  MqlTradeResult BigDogModifResult;
                  ZeroMemory(BigDogModifResult);
                  OrderSend(BigDogModif,BigDogModifResult);
                 }
              }
            if(PositionGetInteger(POSITION_TYPE)==1)
              {//--- sell
               if(TrailingStop>0
                  && ((PositionGetDouble(POSITION_PRICE_OPEN)-lasttick.ask)/Point()>TrailingStop)
                  && (PositionGetDouble(POSITION_SL)==0
                  || (PositionGetDouble(POSITION_SL)-lasttick.ask)/Point()>TrailingStop))
                 {
                  MqlTradeRequest BigDogModif;
                  ZeroMemory(BigDogModif);
                  BigDogModif.action= TRADE_ACTION_SLTP;
                  BigDogModif.symbol= Symbol();
                  BigDogModif.sl = lasttick.ask + TrailingStop*Point();
                  BigDogModif.tp = PositionGetDouble(POSITION_TP);
                  BigDogModif.deviation=3;
                  MqlTradeResult BigDogModifResult;
                  ZeroMemory(BigDogModifResult);
                  OrderSend(BigDogModif,BigDogModifResult);
                 }
              }
           }
        }
     }
  }

Ardından, algoritmamızı bir araya getirin (Şek. 14).





Şek. 14. Algoritma oluşturma

//+------------------------------------------------------------------+
//|                                          BigDog_By_CoreWinTT.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      America=16;
input double   Lots=0.1;
input int      TakeProfit=500;
input long     MagicNumber=665;
input int      Limited=600;
input int      TrailingStop=100;
int dev=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
bool time2trade(int TradeHour,int Number)
  {
   MqlDateTime time2trade;
   TimeTradeServer(time2trade);
   if(time2trade.hour!=TradeHour) return(false);
   time2trade.hour= 0;
   time2trade.min = 0;
   time2trade.sec = 1;
   for(int ii=OrdersTotal()-1;ii>=0;ii--)
     {
      OrderGetTicket(ii);
      long ordmagic=OrderGetInteger(ORDER_MAGIC);
      if(Number==ordmagic) return(false);
     }
   HistorySelect(StructToTime(time2trade),TimeTradeServer());
   for(int ii=HistoryOrdersTotal()-1;ii>=0;ii--)
     {
      long HistMagic=HistoryOrderGetInteger(HistoryOrderGetTicket(ii),ORDER_MAGIC);
      if(Number==HistMagic) return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(time2trade(America+2,int(MagicNumber)))
     {
      int i;
      double Highest= 0;
      double Lowest = 0;
      MqlRates Range[];
      CopyRates(Symbol(),15,0,9,Range);
      Lowest=Range[1].low;
      for(i=0; i<9;i++)
        {
         if(Highest<Range[i].high) Highest=Range[i].high;
         if(Lowest>Range[i].low) Lowest=Range[i].low;
        }
      long StopLevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);
      Highest=Highest+StopLevel*Point();
      //--- add to the current prices the parameters of a minimum possible distance for the order set.
      Lowest=Lowest-StopLevel*Point();
      //--- to ensure the maximum probability of the acceptance of our order.

      if((Highest-Lowest)/Point()<Limited)
        {
         MqlTradeRequest BigDogBuy;
         MqlTradeRequest BigDogSell;
         ZeroMemory(BigDogBuy);
         ZeroMemory(BigDogSell);
         BigDogBuy.action=TRADE_ACTION_PENDING;
         //--- set the pending order
         BigDogBuy.magic = MagicNumber;
         BigDogBuy.symbol=Symbol();
         BigDogBuy.price=Highest;
         //--- Price by which the order will be set
         BigDogBuy.volume=Lots;
         BigDogBuy.sl=Lowest;
         //--- if the stop loss is not established, then we set by the strategy
         BigDogBuy.tp=Highest+TakeProfit*Point();
         //--- set the take profit
         BigDogBuy.deviation=dev;
         //--- Minimum deviation from the requested price, 
         //--- in other words, by how much the executed price can differ from the specified price
         BigDogBuy.type=ORDER_TYPE_BUY_STOP;
         //--- order type, which is executed based on the specified price or by a higher than specified price
         //--- in this case the order is set to a higher or equal amount to the specified price 
         //--- if the order type was buy_limit, then it would be executed 
         //--- by the specified price, or prices lower than the specified price
         BigDogBuy.type_filling=ORDER_FILLING_FOK;
         //--- the given parameter demonstrates how the order acts  
         //--- with partial execution of the scope   
         BigDogBuy.expiration=TimeTradeServer()+6*60*60;
         //--- by the strategy text the order life span only for the current work day
         //--- since it has been 2 hours since the opening of the American market, 
         //--- and the work day is 8 hours, we have 8-2 = 6
         BigDogSell.action=TRADE_ACTION_PENDING;

         //-- Set the pending order
         BigDogSell.magic = MagicNumber;
         BigDogSell.symbol=Symbol();
         BigDogSell.price=Lowest;
         //--- Price by which the order will be set
         BigDogSell.volume=Lots;
         BigDogSell.sl=Highest;
         //-- Stop loss set by the strategy
         BigDogSell.tp=Lowest-TakeProfit*Point();
         //--- Set take profit
         BigDogSell.deviation=dev;
         //--- Minimum deviation from the requested price, 
         //--- in other words, by how much the executed price can differ from the specified price
         BigDogSell.type=ORDER_TYPE_SELL_STOP;
         //--- order type, which is executed based on the specified price or by a higher than specified price
         //--- in this case the order is set to a higher or equal amount to the specified price  
         //--- if the order type was buy_limit, then it would be executed
         //--- by the specified price, or prices lower than the specified price
         BigDogSell.type_filling=ORDER_FILLING_FOK;
         //--- the given parameter demonstrates how the order acts  
         //--- with partial execution of the scope 
         BigDogSell.expiration=TimeTradeServer()+6*60*60;
         //-- by the strategy text the order life span only for the current work day
         //--- since it has been 2 hours since the opening of the American market, 
         //--- and the work day is 8 hours, we have 8-2 = 6
         MqlTradeResult ResultBuy,ResultSell;
         ZeroMemory(ResultBuy);
         ZeroMemory(ResultSell);
         OrderSend(BigDogBuy,ResultBuy);
         OrderSend(BigDogSell,ResultSell);
        }
     }

//--- trailing implementation
   int PosTotal=PositionsTotal();
   for(int i=PosTotal-1; i>=0; i--)
     {
      //--- go through open positions and see if there are positions created by this Expert Advisor.
      if(PositionGetSymbol(i)==Symbol())
        {
         if(MagicNumber==PositionGetInteger(POSITION_MAGIC))
           {
            MqlTick lasttick;
            SymbolInfoTick(Symbol(),lasttick);
            if(PositionGetInteger(POSITION_TYPE)==0)
              { //--- buy
               if(TrailingStop>0
                  &&(((lasttick.bid-PositionGetDouble(POSITION_PRICE_OPEN))/Point())>TrailingStop)
                  && ((lasttick.bid-PositionGetDouble(POSITION_SL))/Point())>TrailingStop)
                 {
                  MqlTradeRequest BigDogModif;
                  ZeroMemory(BigDogModif);
                  BigDogModif.action= TRADE_ACTION_SLTP;
                  BigDogModif.symbol= Symbol();
                  BigDogModif.sl = lasttick.bid - TrailingStop*Point();
                  BigDogModif.tp = PositionGetDouble(POSITION_TP);
                  BigDogModif.deviation=3;
                  MqlTradeResult BigDogModifResult;
                  ZeroMemory(BigDogModifResult);
                  OrderSend(BigDogModif,BigDogModifResult);
                 }
              }
            if(PositionGetInteger(POSITION_TYPE)==1)
              {//--- sell
               if(TrailingStop>0
                  && ((PositionGetDouble(POSITION_PRICE_OPEN)-lasttick.ask)/Point()>TrailingStop)
                  && (PositionGetDouble(POSITION_SL)==0
                  || (PositionGetDouble(POSITION_SL)-lasttick.ask)/Point()>TrailingStop))
                 {
                  MqlTradeRequest BigDogModif;
                  ZeroMemory(BigDogModif);
                  BigDogModif.action= TRADE_ACTION_SLTP;
                  BigDogModif.symbol= Symbol();
                  BigDogModif.sl = lasttick.ask + TrailingStop*Point();
                  BigDogModif.tp = PositionGetDouble(POSITION_TP);
                  BigDogModif.deviation=3;
                  MqlTradeResult BigDogModifResult;
                  ZeroMemory(BigDogModifResult);
                  OrderSend(BigDogModif,BigDogModifResult);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+


Sonuç

Periyodik ve düzenli olarak ortaya çıkan ve araştırıldığında bize bazı avantajlar sağlayabilecek birçok piyasa olgusu vardır. Ayrıca, belki deneyimli yatırımcılar, iyi bilinen "BigDog" stratejisiyle bazı örtüşmeler fark ettiler, makalede bu ele alınmıyor ve ben bunu bilerek yaptım; böylece okuyucu gerçekten nasıl hazırlandıklarını düşünecek.

İnternette bu stratejinin farklı varyasyonları hakkında bilgi edinebilirsiniz, bu makale yalnızca bu stratejinin dayandığı olguyla ilgilidir.


MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/59

Ekli dosyalar |
Alım Satım Raporları ve SMS Bildirimi Oluşturma ve Yayınlama Alım Satım Raporları ve SMS Bildirimi Oluşturma ve Yayınlama
Yatırımcıların her zaman alım satım terminalinde saatlerce oturma yeteneği ve arzusu yoktur. Özellikle, alım satım sistemi az çok resmileştirilmişse ve bazı piyasa durumlarını otomatik olarak tanımlayabiliyorsa. Bu makalede, alım satım sonuçları raporunun (Expert Advisor, Gösterge veya Script Dosyası kullanılarak) HTML dosyası olarak nasıl oluşturulacağı ve FTP yoluyla WWW-sunucusuna nasıl yükleneceği açıklanmaktadır. Ayrıca alım satım etkinliklerine ilişkin bildirimlerin cep telefonuna SMS olarak gönderilmesini de değerlendireceğiz.
Genetik Algoritmalar - Çok Kolay! Genetik Algoritmalar - Çok Kolay!
Bu makalede yazar, kişisel olarak geliştirilmiş bir genetik algoritmanın kullanımıyla gelişimsel hesaplamaları ele almaktadır. Algoritmanın işleyişini örnekler kullanarak göstermekte olup kullanımı için pratik öneriler sunmaktadır.
Alım Satım için MQL5'te Aktif Kontrol Panelleri Oluşturma Alım Satım için MQL5'te Aktif Kontrol Panelleri Oluşturma
Makalede, MQL5'te aktif kontrol panellerinin geliştirilmesi sorunu ele alınmaktadır. Arayüz öğeleri, olay işleme mekanizması tarafından yönetilir. Ayrıca, kontrol öğeleri özelliklerinin esnek bir şekilde ayarlanması seçeneği de mevcuttur. Aktif kontrol paneli, pozisyonlarla çalışılmasına ve piyasa ve bekleyen talimatların ayarlanmasına, değiştirilmesine ve silinmesine izin verir.
"Yeni Başlayanlar" için MQL: Nesne Sınıfları Nasıl Tasarlanır ve Oluşturulur? "Yeni Başlayanlar" için MQL: Nesne Sınıfları Nasıl Tasarlanır ve Oluşturulur?
Örnek bir görsel tasarım programı oluşturarak, MQL5'te sınıfların nasıl tasarlanacağını ve oluşturulacağını gösteriyoruz. Makale, MT5 uygulamaları üzerinde çalışan yeni başlayan programcılara yönelik olarak yazılmıştır. Nesne yönelimli programlama teorisine derinlemesine dalmaya gerek kalmadan sınıflar oluşturmak için basit ve kolay kavranabilen bir teknoloji öneriyoruz.