yeni başlayan birinin maceraları - sayfa 4

 

Merhaba mql efsaneleri. İş yerindeki öğle yemeği saatimde senin için sahte kodu hazırladım. İşte burada. Neyin eksik olduğunu bana bildirin, ben de ekleyeyim.

N&P Sözde Kodu
Bu strateji ile 1 koda sahip olmak, onu herhangi bir grafiğe ekleyebilmek istiyoruz ve 5 para biriminde çalışacak, kurallara uygunsa her birine hem kısa hem de uzun pozisyonlar girecektir.
---EURUSD---
Eğer ema7>ema14>sma50 ve PriceNow < TopFilterLevel ise (örn: eurusd için 1.3080. Bunu günlük olarak ayarlayacağım) o zaman:
EURUSD Lotları satın alın (lotlar harici değişken olabilir, örneğin 0.01). Aksi takdirde: (yani koşullar karşılanmadı) satın almayın.

ema7<ema14<sma50 ve PriceNow > BottomFilterLevel ise (örneğin: eurusd için 1.1508):
Kısa EURUSD Lotları (agian, harici değişken). Else (yani, karşılanmayan koşullar kısa devre yapmaz).

ALIŞ pozisyonu giriş noktasından 20 pip'e ulaşırsa: EURUSD üzerinde TAKEPROFIT.
KISA pozisyon giriş noktasından 20 pip'e ulaşırsa: EURUSD üzerinde TAKEPROFIT.
20 pip'e ulaşılmazsa (al veya sat), pozisyon kapanana kadar piyasada kalmaya devam edin.

manuel olarak. (ideal olarak, kodu daha kısa tutmak için bunu OrderSend işlevine koyarız).

----GBPUSD---
yukarıdakiyle tamamen aynı kod.

----USDJPY---
YUKARIDAKİNİN AYNISI

---USDCHF---
YUKARIDAKİNİN AYNISI

---AUDUSD---
YUKARIDAKİNİN AYNISI

**Kod özellikleri
Yukarıda belirtilen kriterler karşılanıyorsa, herhangi bir para birimi için hem satın alma hem de açığa alım işlemleri aynı anda gerçekleştirilebilir.
***bu kod için stoploss gerekmez

**bunun için para yönetimi kodu yok

Peki bu nasıl görünüyor?

 
niko :

Merhaba mql efsaneleri. İş yerindeki öğle yemeği saatimde senin için sahte kodu hazırladım. İşte burada. Neyin eksik olduğunu bana bildirin, ben de ekleyeyim.

N&P Sözde Kodu
Bu strateji ile 1 koda sahip olmak, onu herhangi bir grafiğe ekleyebilmek istiyoruz ve 5 para biriminde çalışacak, kurallara uygunsa her birine hem kısa hem de uzun pozisyonlar girecektir.
---EURUSD---
Eğer ema7>ema14>sma50 ve PriceNow < TopFilterLevel ise (örn: eurusd için 1.3080. Bunu günlük olarak ayarlayacağım) o zaman:
EURUSD Lotları satın alın (lotlar harici değişken olabilir, örneğin 0.01). Aksi takdirde: (yani koşullar karşılanmadı) satın almayın.

ema7<ema14<sma50 ve PriceNow > BottomFilterLevel ise (örneğin: eurusd için 1.1508):
Kısa EURUSD Lotları (agian, harici değişken). Else (yani, karşılanmayan koşullar kısa devre yapmaz).

ALIŞ pozisyonu giriş noktasından 20 pip'e ulaşırsa: EURUSD üzerinde TAKEPROFIT.
KISA pozisyon giriş noktasından 20 pip'e ulaşırsa: EURUSD üzerinde TAKEPROFIT.
20 pip'e ulaşılmazsa (al veya sat), pozisyon kapanana kadar piyasada kalmaya devam edin.

manuel olarak. (ideal olarak, kodu daha kısa tutmak için bunu OrderSend işlevine koyarız).

----GBPUSD---
yukarıdakiyle tamamen aynı kod.

----USDJPY---
YUKARIDAKİNİN AYNISI

---USDCHF---
YUKARIDAKİNİN AYNISI

---AUDUSD---
YUKARIDAKİNİN AYNISI

**Kod özellikleri
Yukarıda belirtilen kriterler karşılanıyorsa, herhangi bir para birimi için hem satın alma hem de açığa alım işlemleri aynı anda gerçekleştirilebilir.
***bu kod için stoploss gerekmez

**bunun için para yönetimi kodu yok

Peki bu nasıl görünüyor?

Merhaba arkadaşlar, kodlamayla ilgili temel eğitim gerçekten bu konuda kafamı toplamama yardımcı oldu (ayrıntılı kodlama kısmı eksik olsa da). Meşgul olduğumu göstermek için aşağıdaki kodu ekledim. Düşündüğüm fikir var ama yine de birçok hata veriyor. Start()'ta her şeyin büyük bir parantezin altında olduğunu göreceksiniz, bunu yapmamın nedeni, mql'nin değişken global olarak bildirilemeyeceği hatasıyla geri gelmeye devam etmesi ve hepsini 1 parantez içinde yaptığımda durmuş gibi görünüyordu. hata (birçok başka hata devam etmesine rağmen). Köşeli ayraçların hizalamasını kontrol etmek için notepad++ kullandım. Peki en azından bu konuda doğru yolda mıyım?

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

extern double     Lots = 0.01 ;
extern double     TakeProfit = 20 ;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


   //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init ( )
   {
   return ( 0 ) ;
   }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit ( )
   {
   return ( 0 ) ;
   }


   // Order counting code
   // Return:  0 = no orders
   //          >0 = # long orders
   //          <0 = # short orders
       int CalcOpenOrders ( )
         {
         int long = 0 , short = 0 ;
       for ( int i = 0 ; i < OrdersTotal ( ) ; i + + )    
         //i set to 0 to stop bugs from
         //crawling in, i<Orderstotal means if i is behind the number of orders
         //in market then start counting orders and make i that number
         {
         if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) = = false ) break ;
         //this function selects an order for further processing
         if ( OrderType ( ) = = OP_BUY ) long + + ;
         if ( OrderType ( ) = = OP_SELL ) short + + ;
         }
       if ( long > 0 ) return ( long ) ;
       if ( short > 0 ) return ( - short ) ;
       }

//------------ (fingers crossed this is right). I still don't get it why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1 , ema2 , ema3 , closeup , e1over2 , e2over3 , e1under2 , e2under3 ,
eurusdbuyok , eurusdshortok ;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ( )
   {
   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 ( Bars < 75 )
       {
       Print ( "Bars less than 100" ) ;
       return ( 0 ) ;
       }


   //------------------EURUSD Block-------------------------
   //check order type, if it doesn't equal to buy already then buy


   //here i am setting a condition which will be
   //checked before a trade is opened, it shoudl state 'It's okay to enter
   //into long trade so long as there is either 1 order in place already or
   //none)
  
   // Call function. the returnvalue (output) of the function is stored into ReturnVal
   int ReturnVal = CalcOpenOrders ( ) ;
  
   // Check output of function
   if ( ReturnVal > 0 )    // >0 = long orders. See CalcOpenOrders() 
      eurusdbuyok = 1 ;
       else
       {
      eurusdbuyok = 0 ;
       return ( 0 ) ;
       }

   if ( ReturnVal < 0 )    // <0 = short orders. See CalcOpenOrders()
      eurusdshortok = 1 ;
       else
       {
      eurusdshortok = 0 ;
       return ( 0 ) ;
       }


   //--------------condition ends

   if ( eurusdshortok = = 1 )
       {
       static int ticket ;
       // deleted if(OrdersTotal()==0)
       if ( e1under2 & & e2under3 )      // short function
         {
         ticket = OrderSend ( Symbol ( ) , OP_SELL , Lots , Bid , 0 , 0 , Bid - TakeProfit * Point , "ShortOrder " , 0 , 0 , Red ) ;
         if ( ticket > 0 )
             {
             if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) )
             Print ( "SHORT order opened : " , OrderOpenPrice ( ) ) ;
             }
         }
       return ( 0 ) ;
       }



   //  -------------------------------------------------------------------------------------------
   if ( eurusdbuyok = = 1 )
       {
       static int ticket1 ;
       // deleted if(OrdersTotal()==0)
       if ( e1over2 & & e2over3 & & eurusdbuyok = = 1 ) //buy function
         {
         ticket1 = 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 ( ticket1 > 0 )
             {
             if ( OrderSelect ( ticket1 , SELECT_BY_TICKET , MODE_TRADES ) )
             Print ( "BUY order opened : " , OrderOpenPrice ( ) ) ;
             }
         }
       return ( 0 ) ;
       }

   return ( 0 ) ;
   } 
bu kodun en son sürümüdür. sözdizimsel olarak her şey yolunda görünüyor, ancak strateji test cihazından çalıştırdığımda hiçbir işlem yapmıyor. mantıkta bir sorun var. yardıma ihtiyacım var. Şimdi koda oldukça aşina oldum, program tarafının yapısı.
 
niko wrote >>

Merhaba mql efsaneleri. İş yerindeki öğle yemeği saatimde senin için sahte kodu hazırladım. İşte burada. Neyin eksik olduğunu bana bildirin, ben de ekleyeyim.

N&P Sözde Kodu
Bu strateji ile 1 koda sahip olmak, onu herhangi bir grafiğe ekleyebilmek istiyoruz ve 5 para biriminde çalışacak, kurallara uygunsa her birine hem kısa hem de uzun pozisyonlar girecektir.
---EURUSD---
Eğer ema7>ema14>sma50 ve PriceNow < TopFilterLevel ise (örn: eurusd için 1.3080. Bunu günlük olarak ayarlayacağım) o zaman:
EURUSD Lotları satın alın (lotlar harici değişken olabilir, örneğin 0.01). Aksi takdirde: (yani koşullar karşılanmadı) satın almayın.

ema7<ema14<sma50 ve PriceNow > BottomFilterLevel ise (örneğin: eurusd için 1.1508):
Kısa EURUSD Lotları (agian, harici değişken). Else (yani, karşılanmayan koşullar kısa devre yapmaz).

ALIŞ pozisyonu giriş noktasından 20 pip'e ulaşırsa: EURUSD üzerinde TAKEPROFIT.
KISA pozisyon giriş noktasından 20 pip'e ulaşırsa: EURUSD üzerinde TAKEPROFIT.
20 pip'e ulaşılmazsa (al veya sat), pozisyon kapanana kadar piyasada kalmaya devam edin.

manuel olarak. (ideal olarak, kodu daha kısa tutmak için bunu OrderSend işlevine koyarız).

----GBPUSD---
yukarıdakiyle tamamen aynı kod.

----USDJPY---
YUKARIDAKİNİN AYNISI

---USDCHF---
YUKARIDAKİNİN AYNISI

---AUDUSD---
YUKARIDAKİNİN AYNISI

**Kod özellikleri
Yukarıda belirtilen kriterler karşılanıyorsa, herhangi bir para birimi için hem satın alma hem de açığa alım işlemleri aynı anda gerçekleştirilebilir.
***bu kod için stoploss gerekmez

**bunun için para yönetimi kodu yok

Peki bu nasıl görünüyor?

Merhaba Niko

Sözde kodunuz ilk deneme için oldukça iyi görünüyor.

Bununla birlikte, onu biraz daha yapılandırılmış görmek isterim ve benim için ortaya çıkardığı birkaç soru var.

Genellikle kendim kullanacağım türde bir formata kolayca ve hızlı bir şekilde koyabildim. Bakabilmeniz için buraya bir metin dosyası olarak eklenmiştir. Biçimlendirmeyi görmek için bu dosyayı kaydetmeniz ve not defterinde veya benzer bir düzenleyicide açmanız gerekir.

Bu aşamada belirli bir bilgisayar dilinde yazmadığımızı unutmayın. Biz sadece ne yapmaya çalıştığımızı açık ve net bir şekilde belirtmeye çalışıyoruz.

Sahte kodun oldukça spesifik ve "yasal" olduğunu fark edebilirsiniz. Bilgisayarlarla bu şekilde konuşmamız gerekiyor. Onlardan ne yapmalarını istediğimizi çok net bir şekilde dile getirmeliyiz. Aksi takdirde çöp üretme eğilimleri vardır.

Ayrıca, şeyleri mantıksal gruplar halinde düzenlemek için "Blokların" kullanıldığını fark edeceksiniz. Bunlar, kodu doğru şekilde yapılandırmamıza yardımcı olmak için daha sonra faydalı olabilir. Bu tartışmada daha önce birinin işaret ettiği gibi, bunu sadece eğlence için yapmıyoruz. Kodu daha okunaklı, daha anlaşılır, daha sürdürülebilir ve nihayetinde daha güvenilir ve hatasız hale getirmek için yapıyoruz. Canlı alım satım için kullanılacak olan yazılımda daha sonra son derece önemlidir, tabii ki atmak isteyeceğiniz bir sürü paranız yoksa :) . Cidden, buggy yazılımlarla uğraşmak zorunda kalmadan ticaret yapmak yeterince zordur.

Lütfen size ne gönderdiğime bir göz atın ve gerekli olduğunu düşündüğünüz değişiklikleri yapmaktan çekinmeyin. Sözde kodumda birkaç önemli nokta eksik. Onları işaret edebilir misin?

Sözde kodda gündeme getirdiğim iki soruyu da ele almak isteyebilirsiniz. Akla bir dizi başka soru geliyor ama bunlar asıl kodlama aşamasına kadar bırakılabilir.

Henüz yapmadıysanız, FXtrader2008'in bu tartışmada daha önce bahsettiği Notepad++ düzenleyicisini denemek isteyebilirsiniz. Hayatı biraz daha kolaylaştıran bulabileceğiniz tüm araçları kullanın. Lütfen gözden geçirilmiş sözde kodunuzu bir metin dosyası eki olarak bana geri gönderin. Bu HTML düzenleyicide sözde veya başka bir şekilde yapılandırılmış kod yazmaya çalışmayı biraz sıkıcı ve dağınık buluyorum.

Saygılarımızla

Tim

Dosyalar:
 
TSWilson :

Merhaba Niko

Sözde kodunuz ilk deneme için oldukça iyi görünüyor.

Bununla birlikte, onu biraz daha yapılandırılmış görmek isterim ve benim için ortaya çıkardığı birkaç soru var.

Genellikle kendim kullanacağım türde bir formata kolayca ve hızlı bir şekilde koyabildim. Bakabilmeniz için buraya bir metin dosyası olarak eklenmiştir. Biçimlendirmeyi görmek için bu dosyayı kaydetmeniz ve not defterinde veya benzer bir düzenleyicide açmanız gerekir.

Bu aşamada belirli bir bilgisayar dilinde yazmadığımızı unutmayın. Biz sadece ne yapmaya çalıştığımızı açık ve net bir şekilde belirtmeye çalışıyoruz.

Sahte kodun oldukça spesifik ve "yasal" olduğunu fark edebilirsiniz. Bilgisayarlarla bu şekilde konuşmamız gerekiyor. Onlardan ne yapmalarını istediğimizi çok net bir şekilde dile getirmeliyiz. Aksi takdirde çöp üretme eğilimleri vardır.

Ayrıca, şeyleri mantıksal gruplar halinde düzenlemek için "Blokların" kullanıldığını fark edeceksiniz. Bunlar, kodu doğru şekilde yapılandırmamıza yardımcı olmak için daha sonra faydalı olabilir. Bu tartışmada daha önce birinin işaret ettiği gibi, bunu sadece eğlence için yapmıyoruz. Kodu daha okunaklı, daha anlaşılır, daha sürdürülebilir ve nihayetinde daha güvenilir ve hatasız hale getirmek için yapıyoruz. Canlı alım satım için kullanılacak olan yazılımda daha sonra son derece önemlidir, tabii ki atmak isteyeceğiniz bir sürü paranız yoksa :) . Cidden, buggy yazılımlarla uğraşmak zorunda kalmadan ticaret yapmak yeterince zordur.

Lütfen size ne gönderdiğime bir göz atın ve gerekli olduğunu düşündüğünüz değişiklikleri yapmaktan çekinmeyin. Sözde kodumda birkaç önemli nokta eksik. Onları işaret edebilir misin?

Sözde kodda gündeme getirdiğim iki soruyu da ele almak isteyebilirsiniz. Akla bir dizi başka soru geliyor ama bunlar asıl kodlama aşamasına kadar bırakılabilir.

Henüz yapmadıysanız, FXtrader2008'in bu tartışmada daha önce bahsettiği Notepad++ düzenleyicisini denemek isteyebilirsiniz. Hayatı biraz daha kolaylaştıran bulabileceğiniz tüm araçları kullanın. Lütfen gözden geçirilmiş sözde kodunuzu bir metin dosyası eki olarak bana geri gönderin. Bu HTML düzenleyicide sözde veya başka bir şekilde yapılandırılmış kod yazmaya çalışmayı biraz sıkıcı ve dağınık buluyorum.

Saygılarımızla

Tim

Merhaba TSW. Bunun için teşekkür ederim. Buna epey zaman ayırdığını görebiliyorum, bu yüzden gerçekten minnettarım. Güncellenen sözde kodu ekledim, ancak eklenmemişse, işte aşağıda. Neler kaçırdığınızı görmeye çalıştım ama tam olarak anlayamadım, birkaç şey ekledim ama bunlar sadece açıklamaydı.


Buradan nereye gidiyoruz? Bu 'uygun' kodu oluştururken, hala yukarıdaki kodun bulmacasını çözmeye çalışıyorum. Eski bir yamalı kod olduğu için sözde kodumuzu izlemiyor, ancak en azından 1 para birimi için çalışması gerektiği için hala kafam karıştı. Anahtar şey, onu bu organize olmayan gelişigüzel şekilde inşa etmek, bana gerçek kodlama öğelerini öğretmektir (parantezlerin komut dosyasını nasıl etkilediği, değişkenlerin nerede bildirileceği gibi). Bu kodun neden şimdi olduğu gibi çalışmadığına dair bir fikriniz var mı?

Program Title  - N&P Pseudo Code

START BLOCK - List of Currency Pairs

     EURUSD
     GBPUSD
     USDJPY
     USDCHF
     AUDUSD

END BLOCK - List Of Currency Pairs



START BLOCK - Configuration Parameters

      Set the value of TopFilterLevel manually on a daily basis for EURUSD
      Set the value of BottomFilterLevel manually on a daily basis EURUSD
      Set the value of TopFilterLevel manually on a daily basis for GBPUSD
      Set the value of BottomFilterLevel manually on a daily basis GBPUSD

      Set the value of TopFilterLevel manually on a daily basis for USDJPY
      Set the value of BottomFilterLevel manually on a daily basis USDJPY
      Set the value of TopFilterLevel manually on a daily basis for USDCHF
      Set the value of BottomFilterLevel manually on a daily basis USDCHF

      Set the value of TopFilterLevel manually on a daily basis for AUDUSD
      Set the value of BottomFilterLevel manually on a daily basis AUDUSD

      Set Lot size manually for All positions at once (same lot size)

END BLOCK - Configuration Parameters



START BLOCK  - Entry Rules

     If   the 7 Period Exponential Moving Average is greater than the 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is greater than the  50 period Simple Moving Average       AND
          Current Price   is less than TopFilterLevel  THEN
                       Signal a  BUY (Long) entry condition

     If   the  7 Period Exponential Moving Average is less than 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is less than the 50 period Simple Moving Average       AND
          Current Price   is less than  BottomFilterLevel  THEN
                       Signal a  SELL (Short) entry condition

     ***  Question ***
      What time periods do you want to use for your moving averages? Are the periods  Minutes, Hours, Days, Weeks, Months or  do they need to be variable?
***Answer *** Excellent question. It will be 5 minute periods for all moving averages, they do not need to be variable.

END BLOCK - Entry Rules
      


START BLOCK - Manual Close

      **** Question ***
      You say 
                  "Keep being in the market until the position is closed manually.
                   (ideall we put this into OrderSend function to keep code shorter)."
       
       What exactly do you want the program to do in this block?

***I was unclear on this before, my apologies. There should be no block as this in the code. I will exit positions manually when needed through the trade/terminal window (I assume that’s possible and won’t mess up the EA execution, right). So actually I don’t know if we need to code this flexibility or not? What do you think

END BLOCK - Manual Close  



START BLOCK  - Exit Rules

     If  any Open Position is greater than or equal to 20 pips from the entry level THEN
        Close the Position

END BLOCK  - Exit Rules



START BLOCK - Main  - This block controls the whole flow of the program
         With each Currency Pair in the List of Currency Pairs block do all of the following

                  Process the Exit Rules Block - 
                                    (Note that in practice this would normally just be the automatic execution of a Take Profit  Stop
                                    but we should mention it here in the pseudo code for completness. Of course you may have something else in mind
                                    such as using the program to close an open position—nope not for this code.)
                  Check the Entry Rules block  to see if a BUY or SELL  condition exists for this Currency Pair 

                  Check to see if  there is already  an open  BUY  position for this Currency Pair
                  Check to see if  there is already  an open SELL  position for this Currency Pair

                  If there is no open BUY position  for this currency pair   AND
                      a Buy condition exixts for this currency pair THEN
                              Open a BUY Position  for this currency pair
				Size: Pre-determined Lots

ELSE		If there is already 1 open BUY position for this currency pair		DO NOT OPEN BUY Position for this currency pair.

                   If there is no open SELL position  for this currency pair   AND
                      a SELL condition exixts for this currency pair THEN
                              Open a SELL Position  for this currency pair 
				Size predetermined lots.
  
ELSE		If there is already 1 sell position open for this currency pair		Do not open SELL Positions for this currency pair     
              
END BLOCK - Main 




PS: I will often use just 1 direction on a currency pair (eg: just short, for eurusd for 2 days for instance). How could we build this into the code. My assumption is I could just put ‘//’ infront of the parts of the code I don’t want to use (Eg: infront of buy or sell orders within each currency pair) and then remove them when I need to use that part of code next time. Will this work with a code structured in this way? 

**I can’t really think of anything you left out on purpose, to be honest. Unless it’s to check if there are sufficient funds for the trade, but that’s not necessary yet. Maybe in future versions of the strategy.
 
niko wrote >>

Merhaba arkadaşlar, kodlamayla ilgili temel eğitim gerçekten bu konuda kafamı toplamama yardımcı oldu (ayrıntılı kodlama kısmı eksik olsa da). Meşgul olduğumu göstermek için aşağıdaki kodu ekledim. Düşündüğüm fikir var ama yine de birçok hata veriyor. Start()'ta her şeyin büyük bir parantezin altında olduğunu göreceksiniz, bunu yapmamın nedeni, mql'nin değişken global olarak bildirilemeyeceği hatasıyla geri gelmeye devam etmesi ve hepsini 1 parantez içinde yaptığımda durmuş gibi görünüyordu. hata (birçok başka hata devam etmesine rağmen). Köşeli ayraçların hizalamasını kontrol etmek için notepad++ kullandım. Peki en azından bu konuda doğru yolda mıyım?

bu kodun en son sürümüdür. sözdizimsel olarak her şey yolunda görünüyor, ancak strateji test cihazından çalıştırdığımda hiçbir işlem yapmıyor. mantıkta bir sorun var. yardıma ihtiyacım var. Şimdi koda oldukça aşina oldum, program tarafının yapısı.

Hey çocuklar/kızlar, nasıl doğru şekilde yapılacağını öğrenirken, yukarıdaki kod parçasıyla ilgili herhangi bir yardım (sözde kod değil, kod kodu).

Bugün bir beyin fırtınası yaptım, sanırım hata siparişleri sayan bir fonksiyon var ve bunun yerine ayrı ayrı 2 fonksiyona ihtiyacım var, biri alımları, diğeri satışları sayıyor olabilir. Aşağıdaki kodu programladım (bunun için birkaç şeyi değiştirdim), aşağıda görebilirsiniz. Ama yine de tam bir acemi olduğum için her şey berbattı. Bu konuda herhangi bir fikriniz var mı?

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

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


  //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}


  // Order counting code
  // Return:  0 = no orders
  //          >0 = # long orders
  //          <0 = # short orders
     int CalcOpenOrders()
        {
        int long=0,short=0;
     for(int i=0;i<OrdersTotal();i++)
        //i set to 0 to stop bugs from
        //crawling in, i<Orderstotal means if i is behind the number of orders
        //in market then start counting orders and make i that number
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
        //this function selects an order for further processing
        if(OrderType()==OP_BUY)long++;
        if(OrderType()==OP_SELL)short++;
        }
     if(long>0)return(long);
     if(short>0)return(-short);
     }

//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
  {
  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(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }


  //------------------EURUSD Block-------------------------
  //check order type, if it doesn't equal to buy already then buy


  //here i am setting a condition which will be
  //checked before a trade is opened, it shoudl state 'It's okay to enter
  //into long trade so long as there is either 1 order in place already or
  //none)

  // Call function. the returnvalue (output) of the function is
stored into ReturnVal
  int ReturnVal = CalcOpenOrders();

  // Check output of function
  if (ReturnVal >0)  // >0 = long orders. See CalcOpenOrders()
     eurusdbuyok=1;
     else
     {
     eurusdbuyok=0;
     return(0);
     }

  if (ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
     eurusdshortok=1;
     else
     {
     eurusdshortok=0;
     return(0);
     }


  //--------------condition ends

  if(eurusdshortok==1)
     {
     static int ticket;
     // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder
",0,0,Red);
        if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           Print("SHORT order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }



  //  -------------------------------------------------------------------------------------------
  if (eurusdbuyok==1)
     {
     static int ticket1;
     // deleted if(OrdersTotal()==0)
     if(e1over2 && e2over3 && eurusdbuyok==1) //buy function
        {
        ticket1=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(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
           Print("BUY order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }

  return(0);
  }

 
niko wrote >>

Hey çocuklar/kızlar, nasıl doğru şekilde yapılacağını öğrenirken, yukarıdaki kod parçasıyla ilgili herhangi bir yardım (sözde kod değil, kod kodu).

Bugün bir beyin fırtınası yaptım, sanırım hata siparişleri sayan bir fonksiyon var ve bunun yerine ayrı ayrı 2 fonksiyona ihtiyacım var, biri alımları, diğeri satışları sayıyor olabilir. Aşağıdaki kodu programladım (bunun için birkaç şeyi değiştirdim), aşağıda görebilirsiniz. Ama yine de tam bir acemi olduğum için her şey berbattı. Bu konuda herhangi bir fikriniz var mı?

Merhaba Niko

Sözde koda atıfta bulunarak

Koddan:
*** Soru ***
Hareketli ortalamalarınız için hangi zaman dilimlerini kullanmak istiyorsunuz? Dakikalar, Saatler, Günler, Haftalar, Aylar mı yoksa değişken olmaları mı gerekiyor?
***Cevap *** Mükemmel soru. Tüm hareketli ortalamalar için 5 dakikalık periyotlar olacaktır, değişken olmalarına gerek yoktur.

Ardından, yapılandırma parametreleri alanındaki sözde koda şunun gibi bir ifade eklemenizi öneririm.

"Göstergeler için 5 Dakikalık Zaman Çerçevesi Kullanın"


Dedin:
***Daha önce bu konuda net değildim, özür dilerim. Kodda böyle bir blok olmamalıdır.

Gerektiğinde işlem/terminal penceresinden manuel olarak pozisyonlardan çıkacağım

(Bunun mümkün olduğunu ve EA yürütmesini bozmayacağını varsayıyorum, doğru).

Yani aslında bu esnekliği kodlamamız gerekip gerekmediğini bilmiyorum? Ne düşünüyorsun


Daha sonra bu bloğu sözde koddan silmenizi öneririm.

EA'yı kodlamada herhangi bir sorun olmamalıdır, böylece herhangi bir şeyi karıştırmadan bir pozisyonu manuel olarak kapatmak için terminali kullanabilirsiniz.

Bu satırları eklediniz:

ELSE Bu döviz çifti için halihazırda 1 açık ALIŞ pozisyonu varsa, bu döviz çifti için ALIŞ Pozisyonu AÇMAYIN.

ELSE Bu döviz çifti için halihazırda 1 satış pozisyonu açıksa Bu döviz çifti için SATIŞ Pozisyonları açmayın


*** Soru *** Programın yapmasını İSTEMEDİĞİNİZİ önceki satırlar tam olarak belirledikten sonra neden özellikle belirtmeniz gerekiyor?

programın yapmasını istediğiniz şeyi belirttiniz. Bence sözde kod, mantığınızı dikkatlice düşünmeniz gereken yerdir. Aksi takdirde, muhtemelen

gerçek kodlamaya başladığınızda bir karmaşaya girin.


Dedin:
Not: Bir döviz çiftinde genellikle sadece 1 yön kullanacağım (örneğin: sadece kısa, örneğin 2 gün eurusd için). Bunu kodun içine nasıl yerleştirebiliriz. Benim varsayım, kodun kullanmak istemediğim bölümlerinin önüne '//' koyabileceğim (Örn: her bir döviz çifti içindeki alış veya satış emirlerinin önüne) ve sonra o kısmı kullanmam gerektiğinde bunları kaldırabileceğimdir. bir dahaki sefere kod. Bu, bu şekilde yapılandırılmış bir kodla çalışır mı?


Önerdiğiniz gibi kodu yorumlamak, gitmek için çok zarif bir yol değil. Ayrıca, kodun "UZUN" bölümüne yorum yaparsanız, çok fazla yinelenen kod üretmediğiniz sürece, tüm döviz çiftleri için uzun pozisyon açma işlevini yorumlamış olursunuz. Bu aynı zamanda çok zarif bir yol değildir ve kolayca hatalara yol açar.

Belirli bir süre boyunca uzun EURUSD, kısa GBPUSD olmak ve USDCHF ile ticaret yapmamak isteyebilirsiniz. Bu oldukça kolay bir şekilde gerçekleştirilebilir, ancak sözde kodda kendiniz nasıl tanımlayacağınızı bulmaya çalıştığınızı görmek isterim.


İşte bu konuda olası bir yol hakkında birkaç ipucu.

1. seviyelerinizin nasıl kurulduğuna ve kullanıldığına bir göz atın

2. Düzeyler ondalık sayılarla gösterilir. Git/gitme durumları için, boolean veya bayrak olarak bilinen başka bir temsil türünü kullanmak yaygın bir uygulamadır. Yapmak istediğinizi gerçekleştirmek için bayrakları kullanmak mümkün müdür?


Dedin:

** Dürüst olmak gerekirse, bilerek dışarıda bıraktığın hiçbir şeyi düşünemiyorum. Ticaret için yeterli fon olup olmadığını kontrol etmedikçe, ancak bu henüz gerekli değil.

Belki stratejinin gelecekteki sürümlerinde.


Hayır, yeterli fon olup olmadığını kontrol etmekle ilgili değil. Parti büyüklüğünün belirtilmesi dışında, özellikle para yönetimi olmadığını söylediniz. Bu çok daha temel bir şey.

Sipariş vermek için hangi bilgilere ihtiyacınız var? Sözde kodda bu öğelerin her biri nerede ve nasıl tanımlanıyor ve işleniyor?


Dedin:

Buradan nereye gidiyoruz? Bu 'uygun' kodu oluştururken, hala yukarıdaki kodun bulmacasını çözmeye çalışıyorum. Eski bir yamalı kod olduğu için sözde kodumuzu izlemiyor, ancak en azından 1 para birimi için çalışması gerektiği için hala kafam karıştı. Anahtar şey, onu bu organize olmayan gelişigüzel şekilde inşa etmek, bana gerçek kodlama öğelerini öğretmektir (parantezlerin komut dosyasını nasıl etkilediği, değişkenlerin nerede bildirileceği gibi). Bu kodun neden şimdi olduğu gibi çalışmadığına dair bir fikriniz var mı?


Hayal kırıklığını takdir ediyorum. Eski koda çok hızlı bir şekilde baktım ama açıkçası yapmaya çalıştığınız şey mantıklı değil. Bu kod parçasını yaklaşık 15 dakika içinde yeniden yazabilirim ve istediğinizi yapar, ama mesele bu değil mi? Kod yazmayı öğrenmek istediğini söyledin. Bunu kendi başınıza nasıl yapacağınızı size öğretmeye çalışıyorum.


Nico, bazı (yeni) uygun kodlar yazmaya başlamaktan çok uzakta olduğunu düşünmüyorum ama önce sözde kodda doğru bir şekilde "yapmak istediklerinin" çoğunu elde etmek önemlidir.

Yakında göreceğiniz gibi kodlamayı "çok daha kolay" hale getirecek.


iyi çalışmaya devam et

Şerefe

Tim

 

Merhaba Tim,


Her zaman olduğu gibi, benimle geçirdiğin zaman için gerçekten minnettarım. Devam edeceğim ve sözde kodu, yorumlarınızı yansıtacak şekilde değiştireceğim. Gerçek kod hakkında endişelenmeyin, hadi düzgün yapalım (bazen biraz sabırsızım :), çünkü öğrenme her şeyden daha güçlüdür.

 

Merhaba Tim,


Sözde kodu tekrar gözden geçirdim ve bu noktada acemi beynimin anlayabileceği kadar yaptım. Lütfen ekte bulun, yorumlarınızı bekliyorum!

Dosyalar:
 
niko wrote >>

Merhaba Tim,

Sözde kodu tekrar gözden geçirdim ve bu noktada acemi beynimin anlayabileceği kadar yaptım. Lütfen ekte bulun, yorumlarınızı bekliyorum!

merhaba Nick

Hepsi bu kadar iyi görünüyor.

En son sahte kodunuzu inceledim ve bazı soruları vb. yanıtladım.

Sanırım kodlamaya başlamak için hazırız.


Çok kaba bir kural olarak, programlama süresinin 1/3'ünün spesifikasyona, 1/3'ünün kodlamaya ve 1/3'ünün hata ayıklama ve test etmeye harcanması gerektiğini söylüyorlar.


Yani diyebiliriz ki, bu küçük projede kabaca yolun 1/3'üne geldik!

Şimdi MT4 dili hakkında konuşalım.


Tüm bilgisayar dillerinin, bilgisayarın ne yapmasını istediğinizi anlayabilmesi için, dilin yazılması gereken belirli yolları (bir biçim) vardır. Bu ve diğer dile özgü bilgileri belgelerden öğrenebilirsiniz. MT4 ia için belgeler bu forumda çevrimiçi olarak mevcuttur. Henüz yapmadıysanız, belgelerde bulunan bilgi türlerine bir göz atmak için biraz zaman ayırmanızı öneririm. Ardından, belirli bir konu veya işlev hakkında bilgiye ihtiyacınız olduğunda, onu nerede arayacağınızı bileceksiniz.


Hayatı biraz daha kolaylaştırmak için, MT4 dahil birçok modern bilgisayar dili, sizin için temel bir program düzeni oluşturan şablonlar kullanır. Bu şablon programlara genellikle "sihirbazlar" denir. EA sihirbazını, üzerinde yeşil çarpı işareti bulunan MetatEditor'daki "Yeni" menü öğesinin altında bulacaksınız.


Bunu açarsanız, "Uzman Danışman" için bir şablon bulacaksınız. Bunu seçin ve sizden bir EA adı, yazar ayrıntıları vb. ve parametreler istenecektir. Parametreler daha sonra eklenebilir veya değiştirilebilir ancak bu aşamada parametreleri yapılandırma bloğundan girmek isteyebilirsiniz.

Her parametreye bir ad, bir tür ve bir başlangıç değeri vermeniz istenecektir.


Parametre adları her zaman ne olduklarını açıklayıcı olmalıdır


örneğin EURUSD_TopFilterLevel anlamlı bir isimdir ex1 DEĞİLDİR. Anlamlı veri adlarının kullanılması, programın hata ayıklamasını veya daha sonra değiştirilmesini çok daha kolay hale getirir. MT4'te veri adlarının büyük/küçük harfe duyarlı olduğunu unutmayın. LOTSize, LotSize ile aynı değildir. Veri adları konusunda dikkatli ve tutarlı olmanız gerekir.


Ayrıca her parametre için bir veri tipi (tipi) belirtmeniz istenecektir. MT4, Tam Sayı (int), Ondalık Sayı (double), Metin (dize) ve Doğru / Yanlış veya Bayrak (bool) olmak üzere yalnızca 4 veri türünü kullanır.


Yine veri türleri konusunda dikkatli olmamız ve bunları bilmeden karıştırmamamız gerekiyor, aksi halde ince hatalara neden olabiliriz.


Şablonunuzu sihirbazla oluşturduktan sonra, programınızı "yapılandırmaya" başlamanızı öneririm. MT4'teki temel yapı birimi FONKSİYON'dur.


Burada yazıldığı gibi, aslında hiçbir şey yapmayan en basit temel işlev -



geçersiz MyBasicFunction()

{

}


Metatrader sihirbazı tarafından oluşturulan şablonun içinde zaten üç boş fonksiyon var.



int init()

{

dönüş(0)

}



ilk tanım()

{

dönüş(0)

}



int başlangıç()

{

dönüş(0)

}


Başlatma işlevi, EA'yı bir grafiğe sürükleyip Uzman danışman düğmesini AÇIK düğmesini tıklattığınızda her başlatıldığında çağrılır.

Deinit işlevi, bir grafiğin dışına sürüklediğinizde veya Uzman danışman düğmesini KAPALI'ya tıkladığınızda EA her durduğunda çağrılır.


Başlatma işlevi, eklendiği çizelge tarafından alınan HER YENİ TICK'ta çağrılır. Bu, pazarın ne kadar meşgul olduğuna bağlı olarak dakikada birkaç kez veya daha fazla çağrılabileceği anlamına gelir. İşimizin çoğunu buradan yapacağız.


Şimdilik, ana bloktaki tüm sözde kodu başlatma işlevine koymanızı ve ardından sözde kodu her satırda // ile yorumlamanızı öneririm.


Ardından giriş kuralları bloğu için kendinize ait yeni bir işlev oluşturun ve sözde kodu aynı şekilde yorumlayın.


init ve deint fonksiyonlarını şimdilik olduğu gibi boş bırakın.


Bu kodu hatasız bir şekilde derleyebilmelisiniz ama elbette bu aşamada hiçbir şey yapmayacaktır.


İyi çalışmaya devam edin!


Saygılarımızla

Tim

(Not: Gerekirse skype üzerinden konuşabiliriz ama şimdilik forumla nasıl gittiğimizi görelim)

Dosyalar:
 

Merhaba Tim,

Her zaman olduğu gibi yardımınız ve zamanınız çok değerli! Teşekkür olarak, kodlama işlemini bitirdikten sonra size çok güzel bir şişe şampanya göndermenizi istiyorum.

Evet, mql kitabını birkaç kez inceledim, zorluk teoriyi uygulamaya koymaktı. Ayrıca, iki şeyin nasıl kodlandığını ve bir araya getirildiğini görmek, onları denemek ve anlamak için bu web sitesinde yayınlanan yaklaşık 10 EA'nın çıktısını aldım. Ve MT4'te simülatör tüccarında çok zaman harcıyorum (yani, mevcut EA'ları geriye dönük test etme ve öğrenme).

Kodlama sürecini başlatacağım ve ikimizin de neler olduğunu görmemize yardımcı olmak için blokları çok net ve ayrı yapacağım. Ve forum aracılığıyla size gönderin.

1 Soru: Aracı kurumların agresif pipingi durdurmak için bir şeyler koyduğunu söylediniz. 1. Agresif pipingi ne tanımlarsınız? 2. Hangi şeyleri yerine koyuyorlar?

1 dakikalık zaman dilimlerinde (bir elektronik bahis yöntemiyle) eurusd'u manuel olarak kafa derisine alırdım, aracı kurum devreye girene ve yürütme için gecikmeler (giriş ve çıkış) koymaya başlayana kadar bu gerçekten iyi gidiyordu. Bu nedenle, şimdi bu aracı kurumla bunu yapmanın hiçbir anlamı yok, yasa dışı olsa bile, gecikmeler olmaya devam edecek ve tüm günü mahvedecek (tipik olarak sadece 1 saat kafa derisi yüzerseniz, 2 gecikme yaşarsanız ve değerli zamanınızı kaybederseniz). Agresif bir mahkeme eylemi tehdidinden sonra gecikmiş işlemler için tüm parayı geri aldım.

2 Soru: Farklı brokerler kullanıyor musunuz? Hangi brokerleri önerirsiniz? (burada isim belirtmenize izin veriliyorsa)

Teşekkürler,

Nick