より少ないコード、より多くのアクション...EAを書く - ページ 6

 
Maxim Kuznetsov:

もちろん、メモリも割り当てています。計算やデバッグに必要な深さまで。この断片では30であり、これは十分すぎるほどである。もしどこかで、例えば深さ50の標準偏差を計算する必要があるのなら、キャッシュを増やすべきでしょう。しかも、それはあくまでも計算を早くするためのもの。

オッケーです。誰もが自分のビジョンを持っています。
 
Vladimir Simakov:

展望に問題はない

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql5言語の特徴、TipsとTricks

fxsaber さん 2018.02.15 11:48

MQL5でこのような取引ロジックでスクリプトを書いてみることをお勧めします(感覚を素早く表示するためのMQL4スタイルです)。

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;}

ex5ファイルを添付します。

CloseBy はゼロから作ったので、今までは必要なかったのですが、「弱い」おかげで、あとはCloseBy後のポジションを変更するだけです。

将来的には、COrder と CPostion のラッパークラスを1つずつ用意する予定です。

ファイル:
Test.ex5  43 kb
 

何が行われているのか、言葉で説明してみますね :-)

仮にExpert Advisorが必要だとします。まず、フラクタルによるクロスとトレーリングストップで取引する最もシンプルなものが必要です。つまり、ターミナルでは、次のように表示されます。

BLACKで囲ったのは、表の1行目です。Expert Advisor がそのアルゴリズムに考慮するこれらのデータ。

この領域に何があり、どのようにカウントされ、エキスパートアドバイザーと何が補完されるのか、できるだけコンパクトに記述することが、今回紹介したユースケースの目的です。このデータをもとに、どのような計算をするのか。

私見ですが、一番簡単なのは
1) これらのフィールドに名前を付けてリストアップする、つまりENUMにリストアップする。
2.) 簡単な関数を作成し、ENUM とバーから名前を取って、その値を Expert Advisor に渡す。

普通のプログラマーにとって、簡単なExpert Advisorの開発には一定の方法論(明確に示された手順)がある。

1.入力の定義

2. 数式を記述してデータを補強し、必要に応じて列を追加する。

3.結果のテーブルのどのデータをどこで使うかを指定します。

データを保存するために、私たちはDataFrameというクラスを作りました。このクラスは、データを「列ごとに」保存し、インデックスによるアクセス、データのキャッシュ、オンデマンドの計算を提供します。

この薄型(コードはあまりなく、ユースケースに厳密に必要なもののみ)上に、様々なExpert Advisorを開発することができます。テーブルがカウントされ、シグナルが受信され、取引が開始されます。

もちろん、それだけでは十分ではありません :-)というわけで、プロジェクトがスタートしたわけですが...。そして、既成のソリューションはなく、プロジェクトです。まだ生まれたばかりで、発展途上のプロジェクトです。

 
Vladimir Simakov:

弱」ありがとうございます。

EAではなく、スクリプトか。しかし、EAであってもMT4とMT5の違いを完璧に証明してくれましたね。そのうちの1つは、1行しかないバリエーションです。そして2回目は、残念ながら失敗してしまいました。

 
fxsaber:

EAではなく、スクリプトか。しかし、EAであっても、MT4とMT5の違いを完璧に証明してくれましたね。バリアントの1つには1行しかありません。

さあ、CloseBy、一応、pos1.CloseBy(pos2)はありますが、他は全てオープニングオーダーと動作確認です。mt4では、まず2つのポジションをオープンし、そのオープンに対するチェックを提供する必要もあります。比較のために、スタジオで動作しているコードも掲載していただくといいかもしれませんね。

 
Maxim Kuznetsov


:

何が行われているのか、言葉で説明してみますね :-)

仮にExpert Advisorが必要だとします。まず、フラクタルによるクロスとトレーリングストップで取引する最もシンプルなものが必要です。つまり、ターミナルでは、次のように表示されます。

BLACKで囲ったのは、表の1行目です。Expert Advisor がそのアルゴリズムに考慮するこれらのデータ。

この領域に何があり、どのようにカウントされ、エキスパートアドバイザーと何が補完されるのか、できるだけコンパクトに記述することが、今回紹介したユースケースの目的です。このデータをもとに、どのような計算をするのか。

私見ですが、一番簡単なのは
1) これらのフィールドに名前を付けてリストアップする、つまりENUMにリストアップする。
2.) 簡単な関数を作成し、ENUM とバーから名前を取って、その値を Expert Advisor に渡す。

普通のプログラマーにとって、簡単なExpert Advisorの開発には一定の方法論(明確に示された手順)がある。

1.入力の定義

2. 数式を記述してデータを完成させる。必要に応じて列を追加する。

3.結果のテーブルのどのデータをどこで使うかを指定します。

データを保存するために、「列単位」でデータを保存するDataFrameクラスがあり、インデックスによるアクセス、データのキャッシュ、オンデマンドの計算を提供します。

この薄型(コードはあまりなく、ユースケースに厳密に必要なもののみ)上に、様々なExpert Advisorを開発することができます。テーブルがカウントされ、シグナルが受信され、取引が開始されます。

もちろん、それだけでは十分ではありません :-)というわけで、プロジェクトがスタートしたわけですが...。そして、既成のソリューションはなく、プロジェクトです。まだ生まれたばかりで、発展途上のプロジェクトです。

一般的な考え方として、Ichimokuのラッパークラスの例ですが、mql4で。

#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:

一般的な考え方として、Ichimokuのラッパークラスの例ですが、mql4で。

どのIchimokuコンポーネントのラッパーが必要ですか?そして最も重要なことは、なぜ、どのような種類なのか?
おしゃべりでもいいじゃないですか。

PS/ Excelを見たことがありますか?DataFrameビューでは、Ishimocksは同じように表示されます...他の人たちと同じように...トレーダーは実際にテーブルを使って仕事をします。チャートは、サマリーテーブルの部分的な表現(ビュー)に過ぎない。だから、このデータはテーブルのように扱わなければならない。
トレーダーから見て、プログラムオブジェクトとは何か?何でもないことです。彼の実生活には、そんなものはない。

 
Vladimir Simakov:

さあ、CloseBy、一応、pos1.CloseBy(pos2)、他は全てオープニングオーダーと動作確認をしています。

そういうわけにはいきません。

mt4では、まず2つのポジションをオープンし、そのオープンに対するチェックを提供する必要もあります。比較のために、スタジオで動作しているコードも掲載していただくといいかもしれませんね。

#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:

そういうわけにはいきません。

それは、まさにこの注文の冒頭をコントロールしながら書いたものです。