EA販売者にとってコピーツールは厄介な物です。
1つEAを購入してロット上限までいくとコピーツールでもう一つ上限までエントリーといったところでしょうか。あまりやると板が無くなってしまうかもしれません。
もしくはロット上限のあるサンプルEAをコピーして大量に発注
こうゆう事を懸念すると、サンプルなどが出しにくくなってしまいますね。
メジャーなやり方の一つはMT4を一つ立ち上げて、チャートを2枚表示。
1つのチャートには動かすEAをセット、
もう一つのチャートにはコピーEAをセット
対策:
他のチャートのEAを排除する事は出来ません。
そこで、自分以外のチャートを全部閉じてしまいましょう^^
コード
while(ChartNext(ChartID())!=-1)ChartClose(ChartNext(ChartID()));
ChartID()はセットしたチャートのIDが取得できます。
ChartNext()は渡したIDの次のチャートIDを返します。
渡したIDが最後の場合-1が戻ってきます。
そして、ChartClose()で次のチャートを閉じでしまいます。
どうでしょうー
2019年5月21日火曜日
2019年5月14日火曜日
開発:アイデア!スプレッドチェックについて
開発のアイデアです。
スプレッド上限のロックにこんなソースを使っています。
input int Spread_Limit = 10;
if(MarketInfo(Symbol(),MODE_SPREAD)>Spread_Limit)return;
// ここから発注ロジック
スプレッド上限のロックにこんなソースを使っています。
input int Spread_Limit = 10;
if(MarketInfo(Symbol(),MODE_SPREAD)>Spread_Limit)return;
// ここから発注ロジック
スプレッド20で試験をする時には 設定を変更してからテスト開始します。
しかし、かなりよくやってしまうのが、テスターのスプレッドを20に上げて、設定は10のまま試験を開始!!
全く取引していない結果を見て設定を20に変更し再度テスト!!
そこで!
if(s<MarketInfo(Symbol(),MODE_SPREAD)&&!IsTesting())return;
こうすれば、バックテストの時はスプレッド上限を回避できますね。
小ネタでした!
2019年4月24日水曜日
スワップ 11日の悲劇 バックテストに影響が・・・
GWの影響で、本日はSWAPが11日もらえる日です。
明日の朝は早起きしていただこうかと思います^^
さて、本日ひさびさに時間が空いたのでEAを開発しました。
まずは買い建てLONGから設計構築します。
感がいいのか、今日は恐ろしく成績のいい物ばかりできます。
続いて売り建てSHORTを構築すると、あまりいいものができません。
色々やっても成績が出ないので、考えてみました。
明日の朝は早起きしていただこうかと思います^^
さて、本日ひさびさに時間が空いたのでEAを開発しました。
まずは買い建てLONGから設計構築します。
感がいいのか、今日は恐ろしく成績のいい物ばかりできます。
続いて売り建てSHORTを構築すると、あまりいいものができません。
色々やっても成績が出ないので、考えてみました。
!
原因がヒラメキマシタ。
今日はSWAP 11日の日です。
スワップの設定が11日分になっているため、
バックテストに大量のスワップが計上されていたようです。
LONGがよくって SHORTが悪い こうゆう事ですね
2019年4月11日木曜日
最適化で勝率を表示 無料ソース公開
古来より最適化に勝率を出す方法がいろいろと考えられてきました。
今回は OnTester() 関数を使用して、勝率を表示します。
double OnTester()
{
double cWin=0;
for(int i=0;i<OrdersHistoryTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
if(OrderProfit()>0)cWin++;
}
return cWin/OrdersHistoryTotal()*100;
}
このコードをmql4の最後に付けて最適化をします。
OnTester結果に勝率が出力されました。
【ソース解説】
勝率は 勝った回数(cWIN) ÷ 取引数です。
①勝った回数をいれる変数 cWIN を宣言します。
最後に勝率計算で小数が出ますので double にします。
②for ループで取引回数まわします。
バックテストのOrdersHistoryTotal()はバックテストだけの取引数が入るので便利です
③オーダーを選択します。
より厳格にするために失敗した時には敗けたと考えて計算します。
その為にcontinue にしています。
④利益を確認して cWin を加算します。
⑤最後に returnで戻り値を返します。
return に()カッコを付けない人はほとんどいませんが、カッコつけなくてもいいじゃん!
※ブログ頑張ってかきますね!
今回は OnTester() 関数を使用して、勝率を表示します。
double OnTester()
{
double cWin=0;
for(int i=0;i<OrdersHistoryTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
if(OrderProfit()>0)cWin++;
}
return cWin/OrdersHistoryTotal()*100;
}
このコードをmql4の最後に付けて最適化をします。
OnTester結果に勝率が出力されました。
【ソース解説】
勝率は 勝った回数(cWIN) ÷ 取引数です。
①勝った回数をいれる変数 cWIN を宣言します。
最後に勝率計算で小数が出ますので double にします。
②for ループで取引回数まわします。
バックテストのOrdersHistoryTotal()はバックテストだけの取引数が入るので便利です
③オーダーを選択します。
より厳格にするために失敗した時には敗けたと考えて計算します。
その為にcontinue にしています。
④利益を確認して cWin を加算します。
⑤最後に returnで戻り値を返します。
return に()カッコを付けない人はほとんどいませんが、カッコつけなくてもいいじゃん!
※ブログ頑張ってかきますね!
#property strict における 変数の初期化
前回のブログで 変数の初期化について少しふれました。
①Case 1
#property strict
void OnTick()
{
int a;
int b=a;
}
ここではstrict モードにして、関数内でローカル変数 a を宣言し中身を入れていません。
次に b=a で a を参照させコンパイルするとこんな警告が出ます。
possible use of uninitialized variable 'a' test.mq4 5 8
①Case 1
#property strict
void OnTick()
{
int a;
int b=a;
}
ここではstrict モードにして、関数内でローカル変数 a を宣言し中身を入れていません。
次に b=a で a を参照させコンパイルするとこんな警告が出ます。
possible use of uninitialized variable 'a' test.mq4 5 8
②Case2
#property strict
void OnTick()
{
int a=0;
int b=a;
}
a の宣言時に 0 を代入すると
警告は出ません。
③Case3
#property strict
void OnTick()
{
int a;
Comment(a);
}
こうした場合には警告は出ません。
0 と表示されます。
引数(ひきすう)として渡した場合は参照してもいいようです。
④Case4
#property strict
int a;
void OnTick()
{
int b=a;
}
グローバルエリアで a を宣言しました。
この場合も警告は出ません。
strict モード宣言時にローカル変数内で宣言した変数を初期化(なにかを代入)せずに参照すると警告が出ます。
警告が出ても、正常にコンパイルでき値も0として扱われます。
結論
変数は出来るだけグローバルエリアで宣言するましょう。
バックテスト 最適化用 敗け月 自動計算器
ぱんださん🐼よりOnTestrer()で、成績を出力すると便利と情報を教えていただきました。
イベント関数の動作と順番はこのような感じです。
int OnInit()
イベント起動時に一度だけ動作
void OnTick()
ティックの配信を受け取ると動作
double OnTester()
テスト、最適化でOnDeinit()直前に動作
戻り値はテストの時は操作履歴に表示
最適化の時は最適化結果に表示
void OnDeinit(const int reason)
終了時に一度動作
月単位で何カ月に1回マイナス月が出るかを出力してみます。
double Profit[2100][13];
double OnTester()
{
int StartYYY=2100,EndYYY=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
int YYY=TimeYear(OrderOpenTime());
int MMM=TimeMonth(OrderOpenTime());
if(YYY<StartYYY)StartYYY=YYY;
if(YYY>EndYYY)EndYYY=YYY;
Profit[YYY][MMM]+=OrderProfit();
}
double cWIN=0,cLOSS=0;
for(int i=StartYYY;i<=EndYYY;i++)
{
for(int j=1;j<=12;j++)
{
if(Profit[i][j]>0)cWIN++;
if(Profit[i][j]<0)cLOSS++;
}
}
return ((cWIN+cLOSS)/cLOSS);
}
変数Profit[][]を宣言していますが、初期化が手間なのでグローバルに出しています。(裏技?です)
イベント関数の動作と順番はこのような感じです。
int OnInit()
イベント起動時に一度だけ動作
void OnTick()
ティックの配信を受け取ると動作
double OnTester()
テスト、最適化でOnDeinit()直前に動作
戻り値はテストの時は操作履歴に表示
最適化の時は最適化結果に表示
void OnDeinit(const int reason)
終了時に一度動作
月単位で何カ月に1回マイナス月が出るかを出力してみます。
double Profit[2100][13];
double OnTester()
{
int StartYYY=2100,EndYYY=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
int YYY=TimeYear(OrderOpenTime());
int MMM=TimeMonth(OrderOpenTime());
if(YYY<StartYYY)StartYYY=YYY;
if(YYY>EndYYY)EndYYY=YYY;
Profit[YYY][MMM]+=OrderProfit();
}
double cWIN=0,cLOSS=0;
for(int i=StartYYY;i<=EndYYY;i++)
{
for(int j=1;j<=12;j++)
{
if(Profit[i][j]>0)cWIN++;
if(Profit[i][j]<0)cLOSS++;
}
}
return ((cWIN+cLOSS)/cLOSS);
}
2019年4月6日土曜日
GW恐ろしい事があるようです。スワップ11日DAY! 無料ソース付き♪
YJ FX!さんはMT4が使える会社です。
正確には使える but 自動売買は出来ない を提供されています。
そんなYJさんのカレンダーを見ると
https://www.yjfx.jp/gaikaex/mark/swap/calendar.php
4月24日はスワップ11日DAY!!という恐ろしい日にちがありました。
マイナスのポジションを持っていたら悲劇ですね
USDJPYで70円/DAY の場合
70円 x 11日分 = 770円 7.7Pips!
凄いです。
スワップは会社やペアによって変わるので要注意です。
※実は私が発見したのではなく天下一品を愛する親友から教えてもらいました。
これを自動でするにはこんな感じかな
取引終了時間も会社によって異なるのでmmで設定してください。
55分までのところは54分にしたほうがいいかもしれません。
4月24日23時mm分にエントリーをします。
翌25日になってポジションに利益が出た時(±0も)は終了
スワップ分以上マイナスになったら終了
無いと思いますが、持ち越しても25~30日は上の条件で動きます。
一回使い切りEA 動作チェックはしていません(-_-;)
※ご使用は自己責任で!
input int mm=50;
input int Magic=20190424;
input double Lot=0.1;
MqlDateTime T;
int Ticket,d,i;
void OnTick()
{
TimeToStruct(TimeCurrent(),T);
int c=0;
for(i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,0))continue;
if(OrderMagicNumber()!=Magic)continue;
c++;
if(OrderProfit()>0&&T.day>=25)d=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
if(OrderProfit()+OrderSwap()<=0&&T.day>=25)d=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
}
if(T.mon==4&&
T.day==24&&
T.hour==23&&
T.min==mm&&
!c)Ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,0,0,"11Days",Magic);
if(!c&&T.day>=25){Alert("Fine");ExpertRemove();}
}
正確には使える but 自動売買は出来ない を提供されています。
そんなYJさんのカレンダーを見ると
https://www.yjfx.jp/gaikaex/mark/swap/calendar.php
4月24日はスワップ11日DAY!!という恐ろしい日にちがありました。
マイナスのポジションを持っていたら悲劇ですね
USDJPYで70円/DAY の場合
70円 x 11日分 = 770円 7.7Pips!
凄いです。
スワップは会社やペアによって変わるので要注意です。
※実は私が発見したのではなく天下一品を愛する親友から教えてもらいました。
これを自動でするにはこんな感じかな
取引終了時間も会社によって異なるのでmmで設定してください。
55分までのところは54分にしたほうがいいかもしれません。
4月24日23時mm分にエントリーをします。
翌25日になってポジションに利益が出た時(±0も)は終了
スワップ分以上マイナスになったら終了
無いと思いますが、持ち越しても25~30日は上の条件で動きます。
一回使い切りEA 動作チェックはしていません(-_-;)
※ご使用は自己責任で!
input int mm=50;
input int Magic=20190424;
input double Lot=0.1;
MqlDateTime T;
int Ticket,d,i;
void OnTick()
{
TimeToStruct(TimeCurrent(),T);
int c=0;
for(i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,0))continue;
if(OrderMagicNumber()!=Magic)continue;
c++;
if(OrderProfit()>0&&T.day>=25)d=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
if(OrderProfit()+OrderSwap()<=0&&T.day>=25)d=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
}
if(T.mon==4&&
T.day==24&&
T.hour==23&&
T.min==mm&&
!c)Ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,0,0,"11Days",Magic);
if(!c&&T.day>=25){Alert("Fine");ExpertRemove();}
}
2019年4月3日水曜日
令和記念! DUKAS MT4開始 FXTF社名変更
4月3日に書くのは少し遅いかもしれませんが、年号が決まりました。
令和
なかなか、かわいい字面です。
令の字は屋根の下でお辞儀をしている形とのことですがこんなかんじでしょうか
/ \
Orz
そしていよいよ デュ―カスコピー社のMT4が使用できるようになりました。
MT4の次はMT5ではなくJFOREXかもしれないと思っていたのですが…
さらに FXTFの社名が変更されたようです。
新しい社名はゴールデンウェイ・ジャパン
本国名は金道集團
わたし的には金道日本のほうがカッコよく感じます。
2019年3月28日木曜日
【脱線】TradingView
最近はブログの更新がほとんどできていません。
二行目 EA?ストラテジーの名前を宣言
三行目 RSI10に終値期間10のRSIの値を入れます。
四行目 if は同じような感じです && は ANDです
五行目 OrderSend() ポジションに"TACA RSI LONG"と名前を付けて発注
下から二行目 OrderClose()です。
なぜかクローズにも名前を付けてから、
OrderSelect()なしでダイレクトにポジション名"TACA RSI LONG"を指定します。
when = RSI10>70 これが面白いところです。
TPやSLのように 条件を入れることが出来ます。
やはりEASYLanguageっぽいですね
ごめんなさい。
かなり開発案件を抱えていまして・・・・
と、忙しぶってみました^^
開発からの現実逃避でトレーディングビューをすこし
//@version=3
strategy("TACA_RSI",overlay=true)
RSI10=rsi(close,10)
if( RSI10<30 )
strategy.entry("TACA RSI LONG" ,strategy.long )
if(RSI10>70 )
strategy.entry("TACA RSI SHORT",strategy.short)
strategy.exit("Exit Long" ,"TACA RSI LONG" ,when = RSI10>70 )
strategy.exit("Exit Short","TACA RSI SHORT",when = RSI10<30)
一行目 バージョン 必ず必要です。
二行目 EA?ストラテジーの名前を宣言
三行目 RSI10に終値期間10のRSIの値を入れます。
※Symbol()やらPERIOD_CURRENT はいりません
トレードステーションに近い感じです
四行目 if は同じような感じです && は ANDです
五行目 OrderSend() ポジションに"TACA RSI LONG"と名前を付けて発注
※Magicナンバーの代わりにこの名前を使います。
細かい事は省略可能
ifを使わずにwhen で条件を入れてしまう事も出来ます。exit参照
下から二行目 OrderClose()です。
なぜかクローズにも名前を付けてから、
OrderSelect()なしでダイレクトにポジション名"TACA RSI LONG"を指定します。
when = RSI10>70 これが面白いところです。
TPやSLのように 条件を入れることが出来ます。
やはりEASYLanguageっぽいですね
2019年3月24日日曜日
MT4 の 暗号化 CryptEncode(); 関数登場!
それはメタエディターで遊んでいた時です。
Crと押したところ候補文字にCryptEncode が出てきました。
仮想通貨のようなかっこいい名前の関数です。
いままで気が付かなかったので、最近のビルドで追加されたのかと思います。
使い方はキーと暗号化したいテキストをCryptEncodeで暗号化して
CryptDecode で復号化します。
データーの変換方法は以下の種類から選べます。
ENUM_CRYPT_METHOD
定数
|
説明
|
CRYPT_BASE64
|
BASE64
|
CRYPT_AES128
|
128ビット(16バイト)キーでの AES 暗号化。
|
CRYPT_AES256
|
256 ビット(32 バイト)キーでの AES 暗号化。
|
CRYPT_DES
|
56ビット(7バイト)キーでの DES 暗号化。
|
CRYPT_HASH_SHA1
|
SHA1 HASH の計算。
|
CRYPT_HASH_SHA256
|
SHA256 HASH の計算。
|
CRYPT_HASH_MD5
|
MD5 HASH の計算。
|
CRYPT_ARCH_ZIP
|
ZIP アーカイブ。
|
(参照MQL5)
用途不明ですが、まあ使ってみましょう。
void OnInit()
{
uchar data[],Txt[],Key[],Txt2[];
int res,res2;
StringToCharArray("abcdefg",Key);
StringToCharArray("TEXT-test",Txt);
Print("1 ",CharArrayToString(Txt));
res =CryptEncode(CRYPT_DES,Txt,Key,data);
Print("2: ",CharArrayToString(data));
res2=CryptDecode(CRYPT_DES,data,Key,Txt2);
Print("3: ",CharArrayToString(Txt2));
}
キー"abcdefg" を 配列Keyにいれます。StringToCharArray("abcdefg",Key);
暗号化したい"TEXT-test"を配列Txtに格納します。StringToCharArray("TEXT-test",Txt);
DES暗号化をつかってTxtをKeyをつかって暗号化したものを配列dataにいれます。CryptEncode()
DES暗号化で暗号化したdata をKeyで復号化したものをTxt2にいれます。
CryptDecode()
さーて なんに使おうかな
2019年3月14日木曜日
ビルド1160問題 デモ口座全滅・・・
MT4のバージョン(BUILD)アップに伴い
①WINDOWSの古いバージョンではMT4が使えなくなる。
②古いMT4は使えなくなる
この二点がアナウンスされていました。
①https://www.metatrader4.com/ja/releasenotes/491
② は各ブローカー BEEKS社より案内が来ていました。
アナウンスを全く無視して海外で遊び惚けてきました。
先程VPSを見ると・・・・・
膨大な額の含み損を抱えているMT4がいくつかあります (-_-;)
よくみると、すべてデモ口座です。実口座じゃなくてよかった♪
しかし、計測していたデーターがすべておかしくなってしまいました。
全然よくないじゃないか・・・・
すべて3月1日より動いていません。
皆様も、MT4しっかりと再起動しましょうね・・・
①WINDOWSの古いバージョンではMT4が使えなくなる。
②古いMT4は使えなくなる
この二点がアナウンスされていました。
①https://www.metatrader4.com/ja/releasenotes/491
② は各ブローカー BEEKS社より案内が来ていました。
アナウンスを全く無視して海外で遊び惚けてきました。
先程VPSを見ると・・・・・
膨大な額の含み損を抱えているMT4がいくつかあります (-_-;)
よくみると、すべてデモ口座です。実口座じゃなくてよかった♪
しかし、計測していたデーターがすべておかしくなってしまいました。
全然よくないじゃないか・・・・
すべて3月1日より動いていません。
皆様も、MT4しっかりと再起動しましょうね・・・
登録:
投稿 (Atom)

