FC2ブログ

ほったらかしのメタトレードで資産1億円を目指す

今月から楽天のアフェリエイトをやっています。
サイトを経由するだけで、購入金額の1%が懐に入ってきます。
ぜひぜひ、皆様もお試しくださいね。

今月から楽天のアフェリエイトをやっています。
サイトを経由するだけで、購入金額の1%が懐に入ってきます。
ぜひぜひ、皆様もお試しくださいね。

04 | 2021/05 | 06
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -

最強EA 9.2

無料ダウンロード

 RSI_BREAKOUTのPYTHON版を作成いたしました。

リポジトリ github.com/chanmoto/chanmoto.github.io/tree/master/rsibreakout


ポイント

あえてポイントだけ書くとすると・・・


検討事項(1)   MT4→Js/Pythonへの移植に関して

今回、検討した内容に関しては、特段言及する必要もないが、
Pythonを使うことで、ずいぶんとMT4をいじくりまわすよりも、
やりやすかった。
特にデバッグなどが、慣れたVSCODE+PDBの環境なので
サクサクと進めることができた。

ざくっとかかった工数を書くが・・・
  • JS : 約3日
  • MT5 : 5日 → 結局、断念した。
  • Python : 約1日

もちろんではあるが、RSIの計算や移動平均計算は、JSで調べたことを展開しているので
Pythonが一番、早いというわけではない。

しかしながら、JSで苦しんだ配列内のスライスループなど、Pythonならではで
やり易かったのは事実である。

またチャート表示は、JSのライブラリを探すのに、GITHUBを調べまくったが
Pythonなら直ぐにキャンドルとインジケータが表示できたのも、
優れたライブラリ環境のあるPythonならではのものである。

オリジナルコード
********************************************

MT4   Hi_stack[ll] = ArrayMaximum(RSI, ii[1+ll*2]-ii[0+ll*2]+1, ii[0+ll*2]+1);

********************************************

移植版
********************************************
a1 = ii[0 + linel * 2] + 1;
a2 = ii[1 + linel * 2] + 1;
b1 = ii[1 + linel * 2] + 1;
b2 = ii[2 + linel * 2] + 1;

(JS)
     HiStack[linel] = RSI.indexOf(RSI.slice(a1, a2).reduce((a, b) => a > b ? a : b), a1);

(Python)
     HiStack.append(RSI.index(max(RSI[a1:a2])))

*********************************************

JSの場合は、リストのスライスの書き方が難しい。
Reduceの後のアロー関数とか・・・ なんでやねんという感じ

PYTHONの場合、そもそもスライスは超簡単・・・
それと、配列でネストしてアウトオブレンジを気にするよりも、
リストでAppendした方が圧倒的に低ストレスのプログラミングが可能
(JSも同じことが出来るのかもしれない。MT4/MT5はダメ言語だ。)


検討事項(2)  RSI平滑化に関して

これは副二次的なものではあるが、この1週間に調べまくった成果で
RSIのダマシを回避するのに、RSI平滑化を取り入れてみた。

平滑化前 → RSI計算に、CLOSEを使用

9432_JP_eq.png
平滑化後
HI,LOW,CLOSEのRSIで平均化

9432_JP.png

若干ながら線の交錯が少なくなっているように思える。
このような小手先の検討というのは、まだまだ取り組む余地がありそうである。


今後の予定
  • Pythonへの移植が完了したため、今後はAIシステム化を検討する。
  • 現時点では、JSはブログ宣伝用(APIパーツ化して、CSVデータを毎日、ダウンロード更新)
  • MT4 → 最強EAの再稼働 → ただしEAで使えるのは、OANDA東京サーバーのみ、かつ最低単位は0.1ロットから(バーチャル口座でテスト運用のみ)

スポンサーサイト





先に結論だけ書きます。

この5日間、MT5と格闘しましたが、検討を中止します。

<理由>
・インジケータのBUFFERを増やすと、メモリオーバーで表示されない

<その他>
・MQL5コミュにて、ヘルプが期待できず

<結論>
・MT5は不必要
→ ただし既存のインジケータ等であれば、それなりに良いと思う。

こんなにも苦労させられるとは、思いもよらなかった・・・



現在の位置
とりあえず5年ぶりに、最強EAを復活しました。
ファイルはここにあります。

https://drive.google.com/drive/folders/0B25N1Xc5TfvGMWY0bmJnQlFWYk0

思えば、このアルゴリズムもバックテストでは成績優秀だったんですけどね。


無題

▽続きを読む▽

 最近であるが、リモートワークで自宅にいることが多くて、

前々からカメラ映りが気になり、WIGを購入した。

買ったタイプは、いわゆる頭頂限定の物であるが、
着用すると、自分の気持ちが著しく高揚することを感じて、
このブログのプロフィール写真にも使ってみた。
(この話題は、別の自分のLIFEHACKブログに譲るが・・・)


本題

一応、本題に戻るが、このブログのTOP画面にJSでチャートを描いて、
為替が毎日拝めるようにしてみた。

このブログで紹介した、RSI_BREAKOUTと最強EAは、
もともと言えば、mt4で5年前ぐらいに作ったものであるが、
つい最近、OANDAのホームページを見ると、正式にMT5に
対応したらしく、考えてみたら、AIを使わないトレードなら、
メタトレードを使う方が絶対いいに決まっている・・・

それに5年もたつと、いろんな技術も進歩しているだろうし、
ここは一丁、MT5でやったろうか・・・という気持ちになった。


MT5
 さて、MT5を触るとなると、やはり自分のインジケータを移植したくなるのが、
自然な流れである。しかしながら、MT5に移るには、相当の学習コストが必要であり、
それに対するストレスというものは半端ない。
 その度に、これまでの方法をやめて、頭の回路を入れ替えるのには、
相当の苦労が伴う。
 そんな中で唯一、学習ストレスを緩和してくれるのが、YOUTUBE動画である。
(こういう学習方法も、長年のITスキル勉強の中で、学び覚えたことである。)

そこでいくつか調べていると、下記の方の動画が非常にわかりやすかった。


MT4に比べて、ずいぶんバックテストも進化したものだ・・・

そんな訳で、今日からMT5の勉強もかねて、この記事を書くことにした。

MQL5
EAビルダーでRSIインジケータのソースを作成してみた。
作成されたコードがこちら・・・

今日はこのコードを眺めながら、少しずつ自分のものになるように
改良を進めている。


//+------------------------------------------------------------------+
//|                                                          rsi.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalRSI.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingParabolicSAR.mqh>
//--- available money management
#include <Expert\Money\MoneySizeOptimized.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string             Expert_Title                      ="rsi";       // Document name
ulong                    Expert_MagicNumber                =27893;       //
bool                     Expert_EveryTick                  =false;       //
//--- inputs for main signal
input int                Signal_ThresholdOpen              =10;          // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose             =10;          // Signal threshold value to close [0...100]
input double             Signal_PriceLevel                 =0.0;         // Price level to execute a deal
input double             Signal_StopLevel                  =50.0;        // Stop Loss level (in points)
input double             Signal_TakeLevel                  =50.0;        // Take Profit level (in points)
input int                Signal_Expiration                 =4;           // Expiration of pending orders (in bars)
input int                Signal_RSI_PeriodRSI              =8;           // Relative Strength Index(8,...) Period of calculation
input ENUM_APPLIED_PRICE Signal_RSI_Applied                =PRICE_CLOSE; // Relative Strength Index(8,...) Prices series
input double             Signal_RSI_Weight                 =1.0;         // Relative Strength Index(8,...) Weight [0...1.0]
//--- inputs for trailing
input double             Trailing_ParabolicSAR_Step        =0.02;        // Speed increment
input double             Trailing_ParabolicSAR_Maximum     =0.2;         // Maximum rate
//--- inputs for money
input double             Money_SizeOptimized_DecreaseFactor=3.0;         // Decrease factor
input double             Money_SizeOptimized_Percent       =10.0;        // Percent
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Creating signal
   CExpertSignal *signal=new CExpertSignal;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(Signal_ThresholdOpen);
   signal.ThresholdClose(Signal_ThresholdClose);
   signal.PriceLevel(Signal_PriceLevel);
   signal.StopLevel(Signal_StopLevel);
   signal.TakeLevel(Signal_TakeLevel);
   signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalRSI
   CSignalRSI *filter0=new CSignalRSI;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.PeriodRSI(Signal_RSI_PeriodRSI);
   filter0.Applied(Signal_RSI_Applied);
   filter0.Weight(Signal_RSI_Weight);
//--- Creation of trailing object
   CTrailingPSAR *trailing=new CTrailingPSAR;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set trailing parameters
   trailing.Step(Trailing_ParabolicSAR_Step);
   trailing.Maximum(Trailing_ParabolicSAR_Maximum);
//--- Creation of money object
   CMoneySizeOptimized *money=new CMoneySizeOptimized;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set money parameters
   money.DecreaseFactor(Money_SizeOptimized_DecreaseFactor);
   money.Percent(Money_SizeOptimized_Percent);
//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings())
     {
      //--- failed
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- ok
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+


▽続きを読む▽

過去の記事にも書いているが、今回検討している
RSI_BREAKOUTにおけるAI検討の課題を示しておく。

MTブレイクラインへの適用

一例であるが、RSI_BREAKOUTの偽サインが発動した時のチャートを示す。

(左)(中)RSIが下値予想線を割れて、売りサインが発動
(右)RSIがRSI移動平均線より大きくなり、下値予想線が消失してしまう → つまり偽サインの発動
4.png

このような状況はバックテストを実施することで、ほぼ100%再現が可能である。
→ これらの大量の学習データを用意することで、AIによる偽サイン判定のタスクに帰着できるのではないか・・・

入力パラメータとしては、RSIの移動平均乖離率を使い、複数基準日で多次元化すればいいだろう。
出力パラメータは単純に、BIRTH,DEATHの二値分類で良いだろう。
時系列データであるので、LSTMを使ったRNNが使えるだろう。

そんなこんなでモデル化まで一気に進めたので、あとは実装あるのみである。

つづく

(すみませんが、下記のクリックをお願いします)


にほんブログ村 為替ブログへ
にほんブログ村

▽続きを読む▽

AIトレードシステムのベースインジケーターである
RSI_BREAKOUTを本ブログのプラグインに表示しました。

https://chanmoto.github.io/

次のアクションは、直接APIを叩いて、
所望の銘柄と、足を取りに行くところを開発しないと


その前にアンチエイジングのために、NMNを飲みましょう




緊急宣言自体のさなか、すこし近況報告をば・・・

このところ、BLOGのカスタマイズで Javascriptの勉強をやっている

たとえば、このブログでチャートを表示したいとすると、
どんな方法があるのだろうか?

いろいろ調べてみたが、記事の中で直接的に JavaScriptを動かすのではなくて、
iframeタグを使って、 URLを埋め込めば良いみたいである。

以下のサイトのソースを張ってみた。
LINK


MetaTrader4FX chart blogparts


やり方さえわかってしまえば、
あとは簡単で 単純にサーバーを立ち上げて、
そこにページを作ってしまえば良いのである。

すこしサーバーを立てるのに気になる記事がある。

GitHub を使って3分でWebサーバーを作る - Qiita


これを使えば、リポジトリをサーバー化して、
そこにチャート表示させることができるのだろう

自分のGITHUBでWEBサーバーを立てておき、
ここにIFRAMEで表示してみたら、こうなった。

リポジトリ https://github.com/chanmoto/chanmoto.github.io


こんなんでブログをWEBアプリ化できるなんて・・・

▽続きを読む▽

にほんブログ村 為替ブログ システムトレード 自作EA派へ

motochan

Author:motochan
FXトレード歴10年以上、これまで抱えた損失は500万を超える。起死回生のためテクニカルアナリストとして、再出発。現在は会社員をしつつ、巨万の不労所得を目指し、日夜IT勉強に取り組んでいる。

Copyright(C) 2006 テクニカル講座上級の部屋 All Rights Reserved.
Powered by FC2ブログ. template designed by 遥かなるわらしべ長者への挑戦.