yeni başlayan birinin maceraları

 

Hey millet, kodumda bana yardım ettiğiniz için teşekkür ederim, Londra'da saat 2.11 ve bir süredir bu mql bilmecesini çözmeye çalışıyorum. Bu arada CodesGuru öğreticiler için teşekkür ederim, sunulan standart şeylerden daha açıklar, iyi çaba!


Bir strateji kodlamak için acemi bir arayış içindeyim ve her zaman olduğu gibi bu konuda profesyonellerin yardımına ihtiyacım var.


Aşağıda bir araya getirdiğim bir kod var, ancak nedense sadece kısa işlemleri yürütüyor.


Nedenini bilmeden sıkışıp kaldım. Ek olarak şunu da eklemem gerekiyor: 1. Zaten ters yönde bir işlem açık olup olmadığına bakılmaksızın, kod hem Uzun hem de Kısa işlemleri gerçekleştirmelidir (örneğin: Açık olan bir uzun işlem varsa, kod yine de koşullar karşılanırsa kısa pozisyon). Sanırım ' OrdersTotal ()==0; ile oynamam gerekiyor. çalışıyor ama ne yapacağımı bilmiyorum.


Lütfen yardım et. kod ektedir. (eklemeye çalıştım ama nedense olmuyor, ne olduğu hakkında bir fikriniz var mı?)


Bu kodu hayata geçirmemde bana en çok yardımcı olan kişiye iyi bir şişe şampanya sözü veriyorum :-)


ps: Bunu mt4 simülatör/strateji test cihazında test ediyorum.


yardımlarınızı bekliyoruz arkadaşlar!

Nick

 
//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double     Lots = 0.01 ;
extern double     TakeProfit = 20 ;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init ( )
   {
   return ( 0 ) ;
   }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit ( )
   {
   return ( 0 ) ;
   }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ( )
   {
   if ( Bars < 75 )
       {
       Print ( "Bars less than 100" ) ;
       return ( 0 ) ; 
       }
   //Declaration
   
   double ema1 , ema2 , ema3 , closeup , e1over2 , e2over3 , e1under2 , e2under3 ;
  
  ema1 = iMA ( NULL , 0 , 7 , 0 , MODE_EMA , PRICE_CLOSE , 0 ) ;
  ema2 = iMA ( NULL , 0 , 14 , 0 , MODE_EMA , PRICE_CLOSE , 0 ) ;
  ema3 = iMA ( NULL , 0 , 50 , 0 , MODE_SMA , PRICE_CLOSE , 0 ) ;
 e1under2 = ema1 < ema2 ;
 e2under3 = ema2 < ema3 ;
 e1over2 = ema1 > ema2 ;
 e2over3 = ema2 > ema3 ;

 
 

   if ( OrdersTotal ( ) = = 0 )    // one order at the time
       {
       // Short  Entry
       static int ticket ;
       if ( e1under2 & & e2under3 )      // short function
         {                                                                     
         ticket = OrderSend ( Symbol ( ) , OP_SELL , Lots , Bid , 0 , 0 , Bid - TakeProfit * Point , "Short Order " , 0 , 0 , Red ) ;    
         if ( ticket > 0 )
             {
             if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "SHORT order opened : " , OrderOpenPrice ( ) ) ;
             }
             if ( OrdersTotal ( ) = = 0 )    // one order at the time
             if ( e1over2 & & e2over3 )      //this may be messy cos old version had ==1 for all variables
         
         {
         if ( e1over2 & & e2over3 ) //buy function                                                                    
         ticket = OrderSend ( Symbol ( ) , OP_BUY , Lots , Ask , 0 , 0 , Ask + TakeProfit * Point , "" , 0 , 0 , Green ) ;    //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if ( ticket > 0 )
             {
             if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "BUY order opened : " , OrderOpenPrice ( ) ) ;
             }
             else Print ( "Error opening BUY order : " , GetLastError ( ) ) ;
             return ( 0 ) ;      
         }
 
            
            

            
            
            
             return ( 0 ) ;      
         }
         
         
  
   return ( 0 ) ;
   }
   }
kod bu arkadaşlar!
 

Vay! Bir "acemi" için kodlama oldukça iyi bir iş. Kodunuzu benim yapabildiğimden çok daha kısa bir şekilde yazabilirsiniz.


AL bölümü için iki özdeş koşullu if satırınız olduğunu fark ettim, oysa SATIŞ bölümünde yalnızca bir satır var.


SATIN AL işlevi için ikinci özdeş koşul-if ifadeleri muhtemelen zararsızdır, ancak gerekli mi?


 if(OrdersTotal()==0) // aynı anda bir sipariş
if(e1over2 && e2over3) //bu karmaşık olabilir çünkü eski sürümde tüm değişkenler için ==1 vardı <<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<işte ilki

{
if(e1over2 && e2over3) //işlev satın al <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<işte ikincisi
bilet=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Puan,"",0,0,Yeşil); //12345 ne için? ASk-30*Durma Kaybı Puanı EKLEDİM
if(bilet>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SATIN AL emri açıldı : ",OrderOpenPrice());
}
else Print("SATIN AL emri açılırken hata oluştu : ",GetLastError());
dönüş(0);
}


Ayrıca, aynı Koşullu-if içinde yer alan hem Sat hem de Satın Al işlevlerine sahip olduğunuz görülüyor:



if(OrdersTotal()==0) // aynı anda bir sipariş
{
// Kısa Giriş
statik int bileti;
if(e1under2 && e2under3) // kısa fonksiyon
{ // Bunun için eşleşen parantez SAT ve AL işlevinin çok altındadır<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<aşağıya bakın
bilet=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"Kısa Sipariş",0,0,Kırmızı);
if(bilet>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("KISA sipariş açıldı : ",OrderOpenPrice());
}


if(OrdersTotal()==0) // aynı anda bir sipariş
if(e1over2 && e2over3) //bu dağınık olabilir çünkü eski sürümde tüm değişkenler için ==1 vardı

{
if(e1over2 && e2over3) //işlev satın al
bilet=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Puan,"",0,0,Yeşil); //12345 ne için? ASk-30*Durma Kaybı Puanı EKLEDİM
if(bilet>0)
{
if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES)) Print("SATIN AL emri açıldı : ",OrderOpenPrice());
}
else Print("SATIN AL emri açılırken hata oluştu : ",GetLastError());
dönüş(0);
}







dönüş(0);
} // bu, yukarıda gösterilenle eşleşen parantezdir<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<yukarıya bakın


dönüş(0);
}
}





AL emri, koşullu-düzenlenmişse belirttiğiniz şekilde SATIŞ kriterlerine tabidir.









 
niko :
kod bu arkadaşlar!

Hiç uzun emir vermemesinin sebebi, kısa emri gerçekleştiren kod bloğunu bir kapanış küme parantezi ile kapatmamış olmanızdır. Bu, esasen sadece uzun bir sipariş if ( e1under2 & & e2under3 ) AND ( e1over2 & & e2over3 ) yürüttüğünüz anlamına gelir ki bunun olmayacağını hayal ediyorum.


Halihazırda diğer yönde açık olan bir emir olsa bile, bir emir açmak istediğinizi söylüyorsunuz. Bundan , sipariş sayısını her yönde maksimum bir ile sınırlamak istediğinizi varsayıyorum. OrdersTotal()'ın sıfıra eşit olup olmadığını kontrol ederek, bu sizi etkin bir şekilde her yönde bir değil toplam 1 siparişle sınırlar. Yapmanız gereken, bir döngü ve sayaçlar (bu sitede bir sürü örnek) kullanarak mevcut siparişlerin sayısını ve türünü kontrol etmek, ardından bir siparişin yapılıp yapılmayacağını belirlemek için sonucu kullanmaktır.


Diğer yazınızda MQL yazmayı öğrenmek istediğinizden bahsettiğinizi fark ettim, bu yüzden bunu sizin için yazmayacağım. Bu örnek, öğrenme sürecinde gerekli olan doğru türden basit kod ve mantıktır.


Lütfen bunu kendin için yap ve nasıl devam ettiğini bana bildir.

 

Hey millet, siz efsanesiniz !!!

FXTrader2008 ve cloudbreaker yorumlarınız için teşekkür ederiz. Satın almak için tekrarlanan bir koşul olduğunu fark etmedim, bunu keseceğim ve braketin kapanmaması mantıklı. Kodu kendim öğrenmek istediğim için bana kodlu cevabı vermemek iyi fikir. Döngü/sayaçlar için çevrimiçi bir göz atacağım.

Ah, kodun bu kadar güzel ve kompakt olmasının nedeni, bir arkadaşımın onu bir araya getirmeme yardım etmesidir (bir programcı kimdir).

Ben kendi tarafımdan devam edeceğim ve eğer takılırsam size haber veririm!

Canlı piyasalarda bağımsız olarak mı işlem yapıyorsunuz yoksa meta alıntılar için mi çalışıyorsunuz?

 

Kodunuza derinlemesine bakmadım, ancak bir ilk ipucu:


Kodunuzu daha açık bir şekilde yapılandırmaya çalışın - bunu eğlence için değil, daha iyi okumak ve anlamak için yapıyoruz! Kodun "anlamı" veya anlamı üzerinde hiçbir etkisi yoktur ...


Bakalım, kodunuz nasıl görünmelidir (yalnızca önemli kısım):

 if ( OrdersTotal ( ) = = 0 )    // one order at the time 
   {
   // Short  Entry
   static int ticket ;
   if ( e1under2 & & e2under3 )      // short function
     {                                                                     
      ticket = OrderSend ( Symbol ( ) , OP_SELL , Lots , Bid , 0 , 0 , Bid - TakeProfit * Point , "Short Order " , 0 , 0 , Red ) ;   
       if ( ticket > 0 )
         {
         if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "SHORT order opened : " , OrderOpenPrice ( ) ) ;
         }
       if ( OrdersTotal ( ) = = 0 )    // one order at the time
       if ( e1over2 & & e2over3 )      //this may be messy cos old version had ==1 for all variables
         {
         if ( e1over2 & & e2over3 ) //buy function                                                                    
            ticket = OrderSend ( Symbol ( ) , OP_BUY , Lots , Ask , 0 , 0 , Ask + TakeProfit * Point , "" , 0 , 0 , Green ) ;    //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if ( ticket > 0 )
           {
             if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "BUY order opened : " , OrderOpenPrice ( ) ) ;
           }
         else Print ( "Error opening BUY order : " , GetLastError ( ) ) ;
         return ( 0 ) ;     
         }
       return ( 0 ) ;     
     }
   return ( 0 ) ;
   }
 

Şimdi görebileceğiniz gibi: Yalnızca "kısa" durumunuzu test ediyorsunuz

   // Short  Entry 
   static int ticket ;
   if ( e1under2 & & e2under3 )      // short function

ve bunun içinde "uzun" koşulu iki kez test edersiniz - güvenlik için; ) - bu işe yaramaz.

       if ( e1over2 & & e2over3 )      //this may be messy cos old version had ==1 for all variables 
         {
         if ( e1over2 & & e2over3 ) //buy function                                                                    
 

Daha iyi: (ama mükemmel olmaktan çok uzak)

 if ( OrdersTotal ( ) = = 0 )    // one order at the time 
   {
   // Short  Entry
   static int ticket ;
   if ( e1under2 & & e2under3 )      // short function
     {                                                                     
      ticket = OrderSend ( Symbol ( ) , OP_SELL , Lots , Bid , 0 , 0 , Bid - TakeProfit * Point , "Short Order " , 0 , 0 , Red ) ;   
       if ( ticket > 0 )
         {
         if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "SHORT order opened : " , OrderOpenPrice ( ) ) ;
         } }
   if ( e1over2 & & e2over3 ) //buy function {
      ticket = OrderSend ( Symbol ( ) , OP_BUY , Lots , Ask , 0 , 0 , Ask + TakeProfit * Point , "" , 0 , 0 , Green ) ;    //What's 12345 for? I ADDED ASk-30*Point for stop loss
       if ( ticket > 0 )
        {
          if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "BUY order opened : " , OrderOpenPrice ( ) ) ;
         }
       else Print ( "Error opening BUY order : " , GetLastError ( ) ) ;
     }
  return ( 0 ) ;
  }

Şimdi kısa ve uzun işlemler için çalışması gerekir.

Burada MQL4 ile ilgili bu kitabı okumanızı şiddetle tavsiye ederim - özellikle normal bir programın oluşturulması - çok iyi yazılmış ve stratejinizi kolayca uygulayabilirsiniz. Ben de öyle başladım...

Oradaki dosyaları indirirseniz ve yorumlarda sorun yaşarsanız (Kiril olduğu için) "word" açın, her dosyanın kaynağını internet sayfasından (yorumlar ingilizce olduğu için) word'e kopyalayıp yapıştırın ve son olarak kopyalayıp yapıştırın. Meta düzenleyici. Artık programları İngilizce olarak inceleyebilirsiniz.


Umarım yardımcı olabilmişimdir...


(Bu arada: MQL4'te de çok yeniyim ama programcı olarak çalışıyorum ve bu nedenle sözdizimi ve yapı benim için sorun değil...)


Selamlar TURRİCAN

 
Ooops, cevaplamam gereken sürede diğerleri daha hızlı oldu ...
 
TuRRiCAN wrote >>
Ooops, cevaplamam gereken sürede diğerleri daha hızlı oldu ...

Hey Tourrican bu çok yardımcı oldu teşekkür ederim! Kiril sorun değil, ben Rusum, aslında Sibirya'dan.

Evet, mql kitabını çalıştım, ama yine de pratik öğrenmenin dışında, onu incelemek ve sonra kendiniz bir program yazmaya çalışmak tamamen farklı bir şey (çünkü her bölümde gerçek yaşam örnekleriyle açıkça açıklamazlar). kitap, bu şeylerin neden ve nasıl kullanıldığını biliyorsun.

Ama oraya geleceğim, bu işi yapmak için içimdeki yanan arzu her engelden daha büyük.

 
niko :

Canlı piyasalarda bağımsız olarak mı işlem yapıyorsunuz yoksa meta alıntılar için mi çalışıyorsunuz?

Sorunuza cevap olarak normalde helikopter pilotu olarak çalışıyorum. Ancak ekonomik durum göz önüne alındığında çalıştığım firma şu anda uçmak istemiyor. Bu arada, en iyi arkadaşımın sahibi olduğu bir şirket için EA'lar geliştiriyorum. Oldukça iyi bilinen bazı fonlar adına canlı ticaret yapıyoruz.

Kodlamayı öğrenmeye çalışmana ve elimden geldiğince yardımcı olmaya çalışmana sevindim. Foruma katılan ve kendi kendine yeterli olmayı öğrenmek isteyen birini bulmak canlandırıcı.