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

 
Maxim Kuznetsov :

Tabii ki, onlara hafıza ayırıyorum. Hesaplamalar ve hata ayıklama için gerekenden fazla olmayan bir derinliğe. Yukarıdaki parçada, 30, ki bu fazlasıyla yeterli. Bir yerde, örneğin, 50 derinliğe sahip standart sapmayı hesaplamanız gerekiyorsa, önbellek artırılmalıdır. Ve o zaman bile sadece hesaplamaları hızlandırmak için.

TAMAM. Herkesin kendi vizyonu vardır.
 
Vladimir Simakov :

daire ile her şey yolunda

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

fxsaber , 2018.02.15 11:48

MQL5'te böyle bir ticaret mantığıyla bir komut dosyası yazmaya çalışmanızı öneririm (MQL4 stili sadece anlamın hızlı bir şekilde gösterilmesi içindir)

 void OnStart ()
{
   OrderCloseBy ( OrderSend ( _Symbol , OP_BUY , 1 , Ask , 0 , 0 , 0 ), OrderSend ( _Symbol , OP_SELL , 1 , Bid , 0 , 0 , 0 ));
}
 
fxsaber :
 #include <Template\Objects\COrder.mqh>
#include <Template\Objects\CPosition.mqh>

COrder  *order1,*order2;
CPosition *pos1,*pos2;

//----------------------------------------------------------------------
int OnInit ()
  {
   order1= new COrder( NULL , ORDER_TYPE_BUY , 0.2 , 0.0 , 0.0 , 0.0 );
   order2= new COrder( NULL , ORDER_TYPE_SELL , 0.1 , 0.0 , 0.0 , 0.0 );
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   delete order1;
   delete order2;
   delete pos1;
   delete pos2;
  }
//+------------------------------------------------------------------+
void OnTick ()
  {
   CheckOrder(order1,pos1);
   CheckOrder(order2,pos2);
   if ( CheckPointer (pos1)&& CheckPointer (pos2)) pos1.CloseBy(pos2);
   if ( CheckPointer (pos1)&&pos1.Control()>POSITION_MUST_CLOSE) delete pos1;
   if ( CheckPointer (pos2)&&pos2.Control()>POSITION_MUST_CLOSE) delete pos2;
  }

void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {
   if ( CheckPointer (order1)) order1.TradeTransaction(trans,request,result);
   if ( CheckPointer (order2)) order2.TradeTransaction(trans,request,result);
  }      
//-----------------------------------------------------------------
void CheckOrder(COrder* &order, CPosition* &position){
   if (! CheckPointer (order)) return ;
   switch (order.Control()){
       case ORDER_FULL:        position=NewPosition(order);
                               Print (position.GetTicket(), " Ok" );
       case ORDER_REMOVE:
       case ORDER_ERROR:       delete order;}}
//-------------------------------------------------------------------
CPosition* NewPosition(COrder* &order)  { return CheckPointer (order)&& PositionSelectByTicket (order.GetTicket())? new CPosition(): NULL ;}

Kitaplıklar görünmeyecek. ex5 dosyası ektedir.

CloseBy diz üzerinde yapıldı, henüz buna gerek yoktu, ancak "zayıf" için teşekkürler, sadece CloseBy'den sonra pozisyonda değişiklik yapmak için kalır

Gelecekte COorder ve СPosition için bir sarmalayıcı sınıfı olacak

Dosyalar:
Test.ex5  43 kb
 

Zaten hecelerle ne yapıldığını açıklamaya çalışacağım :-)

Bir danışmana ihtiyaç olduğunu varsayalım. Yeni başlayanlar için - en basit olanı, güvercinlerin kesişiminde işlem yapan ve fraktallardaki durağı takip eden. Yani, terminalde şöyle görünüyordu:

SİYAH karede daire içine alınan tablonun 1 satırıdır. Danışmanın algoritmalarında dikkate aldığı veriler.

Verilen kullanım durumlarının görevi, bu alanda ne olduğunu, nasıl değerlendirildiğini ve EA'nın onu nasıl tamamladığını mümkün olduğunca kompakt bir şekilde tanımlamaktır. Bu verilere göre hangi hesaplamalar yapılıyor.

Bana göre işin en kolayı
1) bu alanları isim vererek listeleyin, yani ENUM'da listeleyin
2) ENUM ve bar'dan isimle, danışmana değerlerini veren basit bir fonksiyon yazın.

Sıradan bir programcı için, basit Uzman Danışmanlar geliştirmek için bazı metodolojiler (açıkça işaretlenmiş adımlar) vardır:

1. Girdiyi Ayarla

2. Formüller yazarak Verileri tanımlayın ve tamamlayın; gerektiği gibi sütun ekleyin

3. Alınan tablodan hangi verilerin ve nerede kullanıldığını belirtin.

Verileri depolamak için, verileri "sütunlara göre" depolayan DataFrame sınıfı yapılır, dizinler, veri önbelleğe alma ve isteğe bağlı hesaplamalarla erişim sağlar.

Zaten bu ince (küçük kod var, sadece kullanım durumu için kesinlikle gerekli olan) bazında, birçok farklı Uzman Danışman oluşturabilirsiniz. Masa sayar, sinyaller alınır, anlaşmalar açılır.

Tabi bu yetmez :-) Yani proje yeni açıldı.. ve hazır bir çözüm yok, bu bir proje. Hangi yeni doğmuş ve gelişmektedir.

 
Vladimir Simakov :

"zayıf" için teşekkürler

Yani bir senaryo, danışman değil. Ancak bir EA ile bile, MT4 ve MT5 arasındaki farkı gösterme konusunda harika bir iş çıkardınız. Seçeneklerden birinde sadece bir satır var. İkincisi maalesef başarısız oldu.

 
fxsaber :

Yani bir senaryo, danışman değil. Ancak bir danışmanla bile MT4 ve MT5 arasındaki farkı mükemmel bir şekilde gösterdiniz. Seçeneklerden birinde sadece bir satır var.

Hadi, CloseBy, fark etmediysen, bende: pos1.CloseBy(pos2), diğer her şey emirleri açmak ve işlemleri kontrol etmek. MT4'te ayrıca önce iki pozisyon açmanız ve bunların açılması üzerinde kontrol sağlamanız gerekir. Belki de çalışma kodunu stüdyoda düzenleyebilirsiniz, bu yüzden tamamen karşılaştırma için.

 
Maxim Kuznetsov


:

Zaten hecelerle ne yapıldığını açıklamaya çalışacağım :-)

Bir danışmana ihtiyaç olduğunu varsayalım. Yeni başlayanlar için - en basit olanı, güvercinlerin kesişiminde işlem yapan ve fraktallardaki durağı takip eden. Yani, terminalde şöyle görünüyordu:

SİYAH karede daire içine alınan tablonun 1 satırıdır. Danışmanın algoritmalarında dikkate aldığı veriler.

Verilen kullanım durumlarının görevi, bu alanda ne olduğunu, nasıl değerlendirildiğini ve EA'nın onu nasıl tamamladığını mümkün olduğunca kompakt bir şekilde tanımlamaktır. Bu verilere göre hangi hesaplamalar yapılıyor.

Bana göre işin en kolayı
1) bu alanları isim vererek listeleyin, yani ENUM'da listeleyin
2) ENUM ve bar'dan isimle, danışmana değerlerini veren basit bir fonksiyon yazın.

Sıradan bir programcı için, basit Uzman Danışmanlar geliştirmek için bazı metodolojiler (açıkça işaretlenmiş adımlar) vardır:

1. Girdiyi Ayarla

2. Formüller yazarak Verileri tanımlayın ve tamamlayın; gerektiği gibi sütun ekleyin

3. Ortaya çıkan tablodan hangi verilerin ve nerede kullanıldığını belirtin.

Verileri depolamak için, verileri "sütunlara göre" depolayan DataFrame sınıfı yapılır, dizinler, veri önbelleğe alma ve isteğe bağlı hesaplamalarla erişim sağlar.

Zaten bu ince (küçük kod var, sadece kullanım durumu için kesinlikle gerekli olan) bazında, birçok farklı Uzman Danışman oluşturabilirsiniz. Masa sayar, sinyaller alınır, anlaşmalar açılır.

Tabi bu yetmez :-) Yani proje yeni açıldı.. ve hazır bir çözüm yok, bu bir proje. Hangi yeni doğmuş ve gelişmektedir.

Genel değerlendirme için, mql4'te olsa da, Ichimoku için bir sarmalayıcı sınıfı örneği.

 #ifndef _ICHIMOKU_
#define _ICHIMOKU_

#include <ProjectLibrary\Functions\MyLib.mqh>

class CIchimoku
  {
private :
   string             cSymbol;
   ENUM_TIMEFRAMES    cFrame;
   int                cTenkan;
   int                cKijun;
   int                cSenkou;
   ENUM_TIMEFRAMES    cTempFrame;
   int                cFrameShift;
public :
                     CIchimoku( string mSymbol, ENUM_TIMEFRAMES mFrame, int mTenkan, int mKijun, int mSenkou, int mDeltaFrame= 0 );
   double             Get( int mBuffer, int mShift= 0 );
   double             Tenkan( int mShift= 0 )       { return Get( MODE_TENKANSEN ,mShift);}
   double             Kijun( int mShift= 0 )        { return Get( MODE_KIJUNSEN ,mShift);}
   double             SpanA( int mShift= 0 )        { return Get( MODE_SENKOUSPANA ,mShift);}
   double             SpanB( int mShift= 0 )        { return Get( MODE_SENKOUSPANB ,mShift);}
   double             Chikou( int mShift= 0 )       { return Get( MODE_CHIKOUSPAN ,mShift);}
   double             CloudMin( int mShift= 0 )     { return MathMin (SpanA(mShift),SpanB(mShift));}
   double             CloudMax( int mShift= 0 )     { return MathMax (SpanA(mShift),SpanB(mShift));}
private :
   ENUM_TIMEFRAMES    CheckFrame();
  };
//--------------------------------------------------------------------------------------------------
CIchimoku::CIchimoku( string mSymbol, ENUM_TIMEFRAMES mFrame, int mTenkan, int mKijun, int mSenkou, int mFrameShift= 0 ):
   cTenkan(mTenkan),cKijun(mKijun),cSenkou(mSenkou),cFrameShift(mFrameShift){
   cSymbol=mSymbol== NULL ? _Symbol :mSymbol;
   if (mFrameShift){
      cTempFrame=mFrame== PERIOD_CURRENT ?( ENUM_TIMEFRAMES ) Period ():mFrame;
      cFrame=::GetShiftFrame(cTempFrame,mFrameShift);}
   else
      cFrame=mFrame;}
//--------------------------------------------------------------------------------------------------
ENUM_TIMEFRAMES CIchimoku::CheckFrame( void ){
   if (!cFrameShift) return cFrame; //>>
   ENUM_TIMEFRAMES frame=( ENUM_TIMEFRAMES ) Period ();
   if (cTempFrame==frame) return cFrame; //>>
   else cTempFrame=frame;
   return ::GetShiftFrame(frame,cFrameShift);}
//--------------------------------------------------------------------------------------------------------------
double CIchimoku::Get( int mBuffer, int mShift= 0 ){
   ResetLastError ();
   double res= iIchimoku (cSymbol,CheckFrame(),cTenkan,cKijun,cSenkou,mBuffer,mShift);
   return ! GetLastError ()?res: 0.0 ;}

#endif 
 
Vladimir Simakov :

Genel değerlendirme için, mql4'te olsa da, Ichimoku için bir sarmalayıcı sınıfı örneği.

hangi Ichimokov bileşeni için bir sarmalayıcı istiyorsunuz? Ve en önemlisi, neden ve ne ...
sadece yıpratmak mı? olabilir neden olmasın.

PS/Excel görüldü mü? DataFrame'de Ichimoki aynı görünecektir. Herkes gibi.. Tüccarlar aslında tablolarla çalışırlar. Bir grafik grafik, bir pivot tablonun yalnızca özel bir temsilidir (görünümü). Bu yüzden bu verileri tablolarla olduğu gibi ele almak gerekir.
Bir tüccarın bakış açısından - bir yazılım nesnesi nedir??? Evet hiçbirşey. Pratik hayatında böyle yaratıklar yoktur.

 
Vladimir Simakov :

Hadi, CloseBy, fark etmediysen, bende: pos1.CloseBy(pos2), diğer her şey emirleri açmak ve işlemleri kontrol etmek.

Bu işe yaramaz.

MT4'te ayrıca önce iki pozisyon açmanız ve bunların açılması üzerinde kontrol sağlamanız gerekir. Belki de çalışma kodunu stüdyoda düzenleyebilirsiniz, bu yüzden tamamen karşılaştırma için.

 #include <MT4Orders.mqh>

#define Bid SymbolInfoDouble ( _Symbol , SYMBOL_BID )
#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

void OnStart ()
{
   OrderCloseBy ( OrderSend ( _Symbol , OP_BUY , 1 , Ask , 0 , 0 , 0 ), OrderSend ( _Symbol , OP_SELL , 1 , Bid , 0 , 0 , 0 ));
}
 
fxsaber :

Bu işe yaramaz.

Bu siparişlerin açılmasının kontrolü ile yazdım.