その他の記事(2)

2019年3月16日

ebook:ファジー推論プログラミング、
GitHub:プログラミング用コード、
アップデートしました。
バージョンは2.01です。
ebook:ファジー推論プログラミングの内容一部修正、加筆しました。


2018年12月02日

手術、入院とか、筆者のソフトウエアーの無知とかで報告が遅れてしまいました。

アップデート前のFuzzyライブラリーがようやく見つかり、インジケータの検証を再開できました。

運良くFuzzyライブラリーが保存してありました。

「ソフトウエアの壊れやすい性質を知る」ことがソフトウエア開発の成功には大切だという事ですね。

MT5アップデートかで、突然インジケータが動かなくなった時の対処方法ですが、
*.ex5実行ファイルにバグが入ったことが考えられます。
対処方法は、まず*.ex5ファイルを削除します。
そして*.mq5ファイルを再度コンパイルします。
MT5は再起動します。
そのあと*.ex5ファイルをチャートにアタッチします。
これでインジケータは直ります。
*.mq5ファイルにバグが入っていることも考えられときは、*.mq5ファイルを書き直す必要があります。


2018年10月14日

FuzzyRviOsc01インジケータに
Internal Errorが出て動作不良になっています。

ファジールールの論理計算が上手くいかなくなりました。

どうやら昨日のMT5のバージョンアップで
Fuzzyライブラリーにバグが入っていたようです。

新しい情報が入りましたらお知らせします。



より効果的に利益を上げる
FuzzyEArvi.mq5の修正方法

簡単な修正で済みますので、ぜひ試してください。

//修正する値
インプットのストップレベルを20にします。
インプットのテイクプロフィットを1000にします。

input int     Stop=20;
input int     TakeProfit=1000;


//修正する値
インプットのbuylevレベルを0.15にます。
インプットのsellevレベルを-0.01にします。

input double  buylev = 0.15
input double  selllev=-0.01;

//追加するコード
下記のコードを追加して買いポジション、売りポジションのクローズレベルを設定します。
ここでは0.0に設定しています。

input double  buycloselev = 0.0;
input double  sellcloselev=-0.0;


//修正するコード
//---entry signal calculate
   /*
   if(Buffer[2]<=buylev && Buffer[1]>buylev)  Buy_sig=true;
   if(Buffer[2]>=selllev && Buffer[1]<selllev)Sell_sig=true;
   */
以前のエントリールールを変更し下記のように設定します。
buylev以上で買いポジション、selllev以下で売りポジションをエントリ-します。
   if(Buffer[1]>buylev)  Buy_sig=true;
   if(Buffer[1]<selllev)Sell_sig=true;
 
//修正するコード 
//---exite signal calculate
   /* 
   if( Buffer[2]>Buffer[1] && Buffer[3]>=Buffer[2])  BuyClose_sig =true;
   if( Buffer[2]<Buffer[1] && Buffer[3]<=Buffer[2])  SellClose_sig=true;
   */
以前のクローズルールを変更し下記のように設定します。
buycloselev以下で買いジションをクローズ、sellcloselev以上で売りポジションをクローズします。 
   if( Buffer[1]<buycloselev )  BuyClose_sig =true;
   if( Buffer[1]>sellcloselev)  SellClose_sig=true;
 
変更は以上で終了です。 





成行注文のプログラムと要求抽出

下記コードはシンプルなMQL5、買い成行注文スクリプトプログラムです。
コンパイルして、チャートにクリック&ドロップすると成行注文します。

#include <trade rade.mqh>

void OnStart()
  {
   MqlTick mqtick;

   SymbolInfoTick(_Symbol,mqtick);

      double p = NormalizeDouble(mqtick.ask,_Digits);

       CTrade m_trade;

       m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,0.01,p,0,0,"");
  }

ーーーーーーーーーーーーーーーーーーーーーー
下記コードは間違い。


void OnStart()
  {
   MqlTick mqtick;

   SymbolInfoTick(_Symbol,mqtick);

      double p = NormalizeDouble(mqtick.ask,_Digits);

       CTrade m_trade;

       m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,0.01,p,0,0,"");
  }

要求抽出(成行注文スクリプト)01
1、#include <trade rade.mqh>の記述が必要、CTrade、m_tradeのコンパイルエラーが3つ出る。
ーーーーーーーーーーーーーーーーーーーーーー
下記コードは間違い。

#include <trade rade.mqh>

void OnStart()
  {
   MqlTick mqtick;

      double p = NormalizeDouble(mqtick.ask,_Digits);

       CTrade m_trade;

       m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,0.01,p,0,0,"");
  }

要求抽出(成行注文スクリプト)02
1、SymbolInfoTick(_Symbol,mqtick);が必要、mqtickが初期化されていないので、ワーニングが1つ出る。
2、買い成行注文は発注可能。

ーーーーーーーーーーーーーーーーーーーーーー
要求抽出(成行注文スクリプト)03
1、標準ライブラリー/トレードクラス/Trade/PositionOpenメソッドを理解する必要がある。

bool  PositionOpen( 
   const string     symbol,         // シンボル 
   ENUM_ORDER_TYPE  order_type,     // 注文を出すための注文の種類 
   double           volume,         // ポジションボリューム 
   double           price,          // 実行価格 
   double           sl,             // 決済逆指値 
   double           tp,             // 決済指値 
   const string     comment=""      // コメント 
  )

ーーーーーーーーーーーーーーーーーーーーーー
要求抽出(成行注文スクリプト)04
1、構造体MqlTick を理解する必要がある。

struct MqlTick 
  { 
   datetime     time;          // 最新の価格更新の時間 
   double       bid;           // 現在のBid価格 
   double       ask;           // 現在のAsk価格 
   double       last;          // 最後の取引の現在価格(Last) 
   ulong        volume;        // 現在のLast価格の数量 
   long         time_msc;      // ミリ秒単位の最新の価格更新の時間 
   uint         flags          // ティックフラグ 
  };
最新価格を保存する構造体

ーーーーーーーーーーーーーーーーーーーーーー
要求抽出(成行注文スクリプト)05
1、関数 SymbolInfoTick()を理解する必要がある。
 
bool  SymbolInfoTick( 
   string    symbol,       // 銘柄名 
   MqlTick&  tick          // 構造体への参照 
   );
指定されたシンボルの現在の価格を MqlTick 型の変数として返す。

ーーーーーーーーーーーーーーーーーーーーーー
要求抽出(成行注文スクリプト)06
1、関数 NormalizeDouble()を理解する必要がある。
 
double  NormalizeDouble( 
   double  value,      // 正規化数 
   int     digits      // 小数点以下の桁数 
   );
浮動小数点数を指定された精度に丸める。



スクリプトで買い注文のプログラムを作成



スクリプトで買い注文のプログラムを作りたいとします。
標準ライブラリーの CTradeクラスを使って作るにはどうすれば良いいでしょうか?
電子書籍「ファジー推論プログラミング:やさしいMQL5」
ではPositionOpenメソッドを使用していますが、実はもっと簡単になります。
まず、MQL5リファレンス>標準ライブラリー >トレードクラス>CTradeでCTradeクラスを調査します。
CTradeクラスの注文メソッドには、
(1)OrderOpen()
(2)PositionOpen()
(3)Buy() があります。
注文メソッドの違いを調べる必要があります。
それぞれのメソッドの引数、戻り値、どういうときに使うか、および仲間のメソッドを調べます。


どういうときに使うかは、メソッドのアルゴリズムのデザインパターンから推理します。
デザインパターンには様々なものがありますが、
しかし最低でも、
1、名前
2、問題
3、解法
の形式で、メソッドの分析が必要になります。
(1)OrderOpen()
このメソッドの仲間には
OrderModify、OrderDelete
があります。
これらは未決注文の操作を目的としています。
(2)PositionOpen()
このメソッドの仲間には
PositionModify、PositionClose、PositionCloseParshal、
PositionCloseBy があります。
これらはポジションの操作を目的としています。
引数の値の入力が必要です。
(3)Buy() このメソッドの仲間には
BuyLimit、BuyStop、Sell、SellLimit、SellStop
があります。
指定されたパラメータで注文します。
引数の値はデフォルトで指定されています。
以上から
今回は成行注文だけなので、
買い注文としてはBuy()メソッドを使用するこが良いことになります。

Buy()メソッドの引数には
デフォルトの引数が指定されていますので、作る手間を省くためそれを使うとすると、
引数はポジションのボリュームとして0.01を入力するだけで済みます。

ブログラミングコードは以下のようにシンプルなコードになります。

#include <Trade/Trade.mqh>

void OnStart()
  {
       CTrade m_trade;
       m_trade.Buy(0.01);
  }


以上

0 件のコメント:

コメントを投稿