Daha az kod, daha fazla kullanım Uzman Danışman yazmak - sayfa 4

 
Maxim Kuznetsov :
Sonraki adımla ilgili gönderiyi neden kaldırdınız? proje halka açık ve halka açık olarak yürütülür

Gonor lütfen seninkini bağla. Ve kaynak kurallarını okuyun.

Forum gönderilerinde ve CodeBase'deki açıklamada her şeyi düzenleyebilirsiniz.

 
Maxim Kuznetsov :
Sonraki adımla ilgili gönderiyi neden kaldırdınız? proje halka açık ve halka açık olarak yürütülür

Gönderiyi gördüm, suç teşkil eden bir şey görmedim. Belli ki iyi görünmüyordu.

 
Maxim Kuznetsov :

Denge elbette düşüyor Peki, “iki MA'nın kesişmesinden” ne istediniz?


Bir danışman için farklı bir temel alabilirsiniz - mash-up'lar en iyi seçenek olmaktan uzaktır.

 
aleger :

Bir danışman için farklı bir temel alabilirsiniz - mash-up'lar en iyi seçenek olmaktan uzaktır.

biraz daha dikkatli bakarsanız zaten bir çok şeyi uygulayabildiğinizi fark edeceksiniz :-)

aşağıdakiler elde edilir:

* uygulama programcısı (kütüphane kullanıcısı), birkaç sütunlu bir mikro excel'e sahip olduğunu beyan etti (kullanım durumunda, FAST_MA,SLOW_MA,SIGNAL_BUY,SIGNAL_SELL)

* ve tek tek hücreleri nasıl hesaplayabileceğinin bir fonksiyonunu çizdi. Örnekte, iMA'ya döndü.

* aynı zamanda bu tablonun diğer hücrelerine sınırsız olarak erişebilir (DataFrame mümkünse dizileri yok eder)

* ve ayrıca kullanıcı "dizenin değerlerini kontrol edin, ticaret zamanı geldi mi" işlevini yazdı

danışmanın ticarete başlaması için bunun yeterli olduğu açıktır. Ve strateji çok esnek bir şekilde değiştirilebilir - tablo hesaplamaları olarak hayal edebileceğiniz her şey, her şey mümkündür.
başka bir şey ise, bunların yalnızca ilk yarım adımlar olmasıdır :-) şimdiye kadar, danışman bir maymun değiştirici gibi, yalnızca minimum lotla, tek bir sembolde ve tek bir zaman diliminde işlem yapar.

 

İlk iki bölümde, halk dilinde "maymunlar veya bir sinyale darbe" olarak tanımlanan en basit stratejileri uygulayabilen bir danışman elde edildi.
Aynı zamanda, sinyallerin kendileri, neredeyse Excel'deki gibi, mümkün olduğunca basit bir şekilde programlanmıştır :-)

Danışmana biraz daha öğretme zamanı. En azından StopLoss'u koyun ve takip edin.

Stratejinin sanatsal tanımını "stoploss_POINTS mesafesine göre stoploss ayarlanır ve ardından fraktallar boyunca izlenir" ifadesiyle tamamlıyoruz. Ve kullanım durumunda öncekinden daha anlaşılır değişiklikler yapıyoruz:

  • yeni EA parametre girişi int STOPLOSS_POINTS=100;
  • iki hesaplanmış alan UPPER_FRACTAL,LOWER_FRACTAL, ENUM_SERIES'e eklendi
  • ve bunları hesaplamak için GetData işlevine iki "vaka:" ekleyin

ve kullanıcıya EA'yı yapılandırması için bir işlev (EA sınıfı yöntemi) sağlayın. En basit gösterim benziyor

SetStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL);

"Belirli bir mesafede zararı durdur ve LOWER_FRACTAL tablo sütununda iz satın al, UPPER_FRACTAL üzerinde sat" olarak okur; bence, yöntemin adı açık ve sözdizimi az çok net.

Varsayımsal kullanıcı zaten birçok hareket yaptı (giriş bildirdi, iki sütun ekledi ve kurulum işlevi olarak adlandırıldı), eylemlerinin beklenen sonuca ulaşması için kitaplığı geliştireceğiz. Tablosal hesaplamalar geliştirmemiz ve mesaj/olay mekanizmasının temellerini atmamız gerekecek.

kompaktlık için kopyala-yapıştırdan kaldırılan ekstra yorumlar ve MQL5 kodu

 input ENUM_APPLIED_PRICE FAST_MA_PRICE= PRICE_CLOSE ;
input ENUM_MA_METHOD FAST_MA_METHOD= MODE_EMA ;
input int FAST_MA_PERIOD= 14 ;
input int FAST_MA_SHIFT= 0 ;

input ENUM_APPLIED_PRICE SLOW_MA_PRICE= PRICE_CLOSE ;
input ENUM_MA_METHOD SLOW_MA_METHOD= MODE_SMA ;
input int SLOW_MA_PERIOD= 54 ;
input int SLOW_MA_SHIFT= 0 ;

// начальные значения StopLoss, TakeProfit
input int STOPLOSS_POINTS= 100 ;
input int TAKEPROFIT_POINTS= 200 ;

#include "EA/EA.mqh"

enum ENUM_SERIES {
   FAST_MA,       // id. значений FAST_MA
   SLOW_MA,       // id. значений SLOW_MA 
   SIGNAL_BUY,     // сигнал к покупкам
   SIGNAL_SELL,   // сигнал к продажам
   UPPER_FRACTAL,       // верхний фрактал (для трала стопов ордеров sell)
   LOWER_FRACTAL, // нижний фрактал
   TOTAL_SERIES   // последний элемент перечисления = кол-во элементов
};

double GetData(EA *ea, int id, int shift,DataFrame *table)
{
   switch ((ENUM_SERIES)id) {
       case FAST_MA:
         return table[FAST_MA][shift]= iMA (ea. Symbol ,ea. Period ,FAST_MA_PERIOD, 0 ,FAST_MA_METHOD,FAST_MA_PRICE,shift);
       case SLOW_MA:
         return table[SLOW_MA][shift]= iMA (ea. Symbol ,ea. Period ,SLOW_MA_PERIOD, 0 ,SLOW_MA_METHOD,SLOW_MA_PRICE,shift);
       case SIGNAL_BUY:
         return table[SIGNAL_BUY][shift]=table.CrossedUp(FAST_MA,SLOW_MA,shift);
       break ;
       case SIGNAL_SELL:
         return table[SIGNAL_SELL][shift]=table.CrossedDn(FAST_MA,SLOW_MA,shift);
       break ;
       // Расчёт уровней трала
       case UPPER_FRACTAL:
         // верхний фрактал. уровень по которому тралятся sell
         return table[UPPER_FRACTAL][shift]=iFractal(ea. Symbol ,ea. Period , MODE_UPPER ,shift+ 2 );
       case LOWER_FRACTAL:
         return table[UPPER_FRACTAL][shift]=iFractal(ea. Symbol ,ea. Period , MODE_LOWER ,shift+ 2 );
   }
   return EMPTY_VALUE ;
}
int SignalOfCross(EA *ea, int shift,DataFrame *data)
{
   if (FAST_MA_PRICE!= PRICE_OPEN || SLOW_MA_PRICE!= PRICE_OPEN ) shift++;
   if (data[SIGNAL_BUY][shift]== 1.0 )   return OP_BUY ;
   if (data[SIGNAL_SELL][shift]== 1.0 ) return OP_SELL ;
   return - 1 ;
}
EA *ea= NULL ;

int OnInit ()
{
   ea = new EA();
   ea.SetupTimeframe( _Symbol , _Period ,TOTAL_SERIES, 30 ,GetData);
   ea.SetupSignal(SignalOfCross);

         // укажем начальный стоп-лосс ордеров и уровни для тралов 
   ea.SetupStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL);
   // и заодно тейк-профит
   ea.SetupTakeProfit(TAKEPROFIT_POINTS);
   // остальная часть одинакова для всех советников
   //................
}
 
Maxim Kuznetsov :

Böyle bir koda bakmak zaten zor. Dışarıdan basitçe yazmak zor bir iştir. Kısalık önemlidir, ancak bununla bile basitlik kolayca ortadan kalkabilir.

Kodunuzla ilgili fikriniz, benimkiyle ilgili fikrim gibi, çok öznel. Dışarıdan gözlemciler zor mu yoksa basit mi olduğunu çok daha nesnel olarak söyleyebilirler.

Kodunuzun bir gözlemcisi olarak zor.

 
fxsaber :

Böyle bir koda bakmak zaten zor. Dışarıdan basitçe yazmak zor bir iştir. Kısalık önemlidir, ancak bununla bile basitlik kolayca ortadan kalkabilir.

Kodunuzla ilgili fikriniz, benimkiyle ilgili fikrim gibi, çok öznel. Dışarıdan gözlemciler zor mu yoksa basit mi olduğunu çok daha nesnel olarak söyleyebilirler.

Kodunuzun bir gözlemcisi olarak zor.

özellikle kullanım durumu için daha anlaşılır ve özlü bir gösterim sunar. Veya mevcut olanı düzenleyin.

Bu en zor nokta - ve temelde tartışma için önerilen kişi o.

 
Maxim Kuznetsov :

özellikle kullanım durumu için daha anlaşılır ve özlü bir gösterim sunar. Veya mevcut olanı düzenleyin.

Bu en zor nokta - ve temelde tartışma için önerilen kişi o.

teklif etmeyeceğim çünkü Bunun neden gerekli olduğunu bilmiyorum ve anlamıyorum bile. Dışarıdan bir gözlemci için MQL4'ten daha basit bir şeyin icat edilmesi pek olası değildir. MQL4'ün geliştiricileri ustaca basit bir mimariye girdiler.

 

Ve çıktı olarak ne elde etmek istiyorsunuz? Açıkçası anlamadım. İlk başta bir çerçevenin düşündüğünü düşündüm, ama hayır, göstergeler, siparişler, standart karar verme algoritmaları için sarmalayıcı sınıfı yok, hiçbir şey. Aşağıdaki yapılar çok daha okunabilir olsa da: fast.Get(2)>=slow.Get(1); (örneğin bu benim) ve beyan:

CMA hızlı=yeni CMA(NULL,0,12,...);

CMA yavaş=yeni CMA(NULL,0,100,...);

Bu tartışılabilir, ancak siz, IMHO, zamanı işaretliyorsunuz.

 
fxsaber :

Kodunuzun bir gözlemcisi olarak zor.

Katılıyorum, dili bilseniz bile kodunuzu okumak çok zor.