MQL4のプログラミングについて

このQ&Aのポイント
  • 自動売買システムのプログラミングで、シグナルにより自動的にとったポジションから 'x' Pipsの利食いで決済させるプログラムを書きたいです。
  • 具体的には、特定のプログラムのシステムでとったポジションを次のシグナルが出ずとも 'x' Pipsの利食いで決済する条件を入れたいです。
  • プログラミングについて初心者で、具体的な方法についてアドバイスをいただきたいです。
回答を見る
  • ベストアンサー

MQL4のプログラミングについて

自動売買システムのプログラミングで、シグナルにより自動的にとったポジションから"x"Pipsの利食いで決済させる("x"はメタトレーダー上で指定できる)プログラムを書きたいのですが、どう書けばいいのか全く分かりません。 決済の条件を変えればいいのか、シグナルが出たときの注文方法を変えればいいのか等々・・・>< 具体的には、下記のページでダウンロードできるサンプルに"MACrossPS_Exp"という名前のファイルがあるのですが、このプログラムのシステムでとったポジションを次のシグナルが出ずとも{"x"Pipsの利食いで決済する}という条件を入れたいのです。 http://www.panrolling.com/books/gr/gr56.html プログラミングについて触れるのもこれが初めてで、かなり初歩的な事も分からない状態なのですが是非アドバイスいただけるとうれしいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#259269
noname#259269
回答No.2

#1です。pips指定ではありませんでしたね、失礼しました。 MetaEditorの OrderSend のヘルプに以下のような文章がありました。 StopLoss and TakeProfit levels cannot be too close to the market. The minimal distance of stop levels in points can be obtained using the MarketInfo() function with MODE_STOPLEVEL parameter. In the case of erroneous or unnormalized stop levels, the error 130 (ERR_INVALID_STOPS) will be generated. マーケットプライスに近すぎる値を StopLoss や TakeProfit に設定する事はできないとかかれてますね。多分エラーがでているのだと思います。バックテストの操作履歴タブに error 130 が出てませんか?

yama_92
質問者

お礼

なるほど、そのようですね。 しかしHelpを見れば解決するような事でしたか・・・ もっと自分で頑張ってみるべきだったかもしれませんね。。 わざわざご丁寧にありがとうございました!

その他の回答 (1)

noname#259269
noname#259269
回答No.1

注文を出すステートメント(命令)に、利食い・損きりまたは、その両方をpipsで指定できた筈です(いわゆるIFOやOCOですね)ので、そうするのがよいと思います。 OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",MAGIC,0,Blue); ↑これの6,7番目の引数(共に0が指定されていますね)のどちらかが利食いのpipsだったんじゃないかな。今手元に環境がないので、うろ覚えですが。 付属のヘルプは英語ですので、それを読むか、リンク先で示されている入門書で学習されるのがよろしいかと思います。

yama_92
質問者

お礼

ありがとうございます。 やはりそこの変更ですよね。 6,7番目は損切り利食いの具体的な価格だと思います。 私の場合最初に extern int Rigui = 10; と定義し(買いの場合) OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,Ask+Rigui*Point,"",MAGIC,0,Blue); と書き(売りはBid-Rigui*Point) 損きりを同じように extern int Songiri = 30; と定義し、買いの場合Ask-Songiri*Point 売りの場合Bid+Songiri*Point を入れ、実行しました。 最初の利食い10損切り30の値ならできるのですが、両方を10以下の数字にするとバックテストが上手くできず、何も表示されないのです。 通貨ペアはとりあえずUSDJPYでテストしています。 何か原因分かるでしょうか? ご意見参考になりました、ありがとうございます^^

関連するQ&A

  • MQL4勉強中です

    metatrader4で自動売買システムを作りたいと思っているのですが、プログラム自体初めてなので、チンプンカンプンです。 FXメタトレーダー入門やネットで学習しているのですが、今一わからない状態です。どなたか基本を教えていただきたいのですが、いらっしゃいませんか?また有益なサイトがありましたら教えていただきたいです 。 また私のような方いらっしゃいましたら、少しでも情報交換したいと思いますので書き込みしていただけると嬉しいです。 よろしくお願いします。

  • MT4(MQL)の初歩がわかりません

    こんにちは、どうかよろしくお願いします MT4(MQL)をはじめたばかりです。 基本的な質問で恐縮ですが、根本が理解できておりません。 幾つか教えて頂きたいのです。 <質問1> MQLで記述したコードはチャートに組み込んで実行していくのは理解できたのですが、2つの異なる時間枠(週足と日足)などの複合的な条件で売買をするシステムは2つのチャートが必要です。このような事はMQLで実装可能でしょうか? 例えば、週足のテクニカル指標のシグナルと日足のテクニカル指標のシグナルとを確認した上で売買を実行するなどです。 <質問2> 初心者向けMQL関連の書籍(非常に親切で解りやすくとてもありがたい書籍です) を拝読したところ、テクニカル指標(MA)を表示するサンプルプログラム(Custom Indicator)と実際にMAのシグナルで売買するサンプルプログラム(Expert Advisor)の2つの例がありました。 Expert Advisor側のサンプルプログラムの中でiMA()という組込み関数が使用されてました。組込みとはMT4に元々用意されていたMAを呼び出したと理解しておりますが、そうすうるとCustom Indicatorで作成されチャート上に表示されたMAとは、関連性が無くそれぞれ独立したシステムなのでしょうか? 仮に私オリジナルのテクニカル指標をExpert Advisor側で作成してチャートに表示させても、Expert Advisor側でそのシグナルは関連付けできないのでExpert Advisor側でもそれと同じテクニカル指標のコードを記述するとこで、トレードシグナルと判断させることがMT4の基本的な考え方なのでしょうか? それともCustom Indicatorのテクニカル指標のシグナルを受取ってExpert Advisor側で判断できる方法もあるのでしょうか?MT4的な考え方が漠然としていて、よく理解できないのです <質問3> 上記質問の関連ですが、MAのシグナルで売買するExpert Advisor側のプログラムを仮に作成してチャートに組込んで使用する場合、そのチャートにMAが表示されていないとiMA()という組込み関数はデータを取得できないのでしょいうか?

  • プログラミング

    C言語のプログラミングで困っています。 二つの微分方程式 y'=yの解をx=0~1の範囲 y'=-4yの解をx=0~4の範囲 を、Runge-Kutta法により求めるプログラムを作りたいのですが、全く分からず困ってます。 初期条件はx=0,y=1で、また、間隔Δxを変えたときの解の変化も調べたい。 回答よろしくお願いします。

  • FXの自動売買サービスが停止できず困っています

    あるFXの自動売買サービスに申し込んだのですが、損失が拡大しそうなためシステムの停止を申請したのに受け入れてもらえません。 メタトレーダー上で複数の顧客の資金を一斉に運用するシステムですが、個別に決済するとシステム全体に不具合が起こるので現在のポジションが全て決済されるまで停止できないそうです。 ポジション保有中は出金もできないそうです。 そのシステムの販売ページには、「お客様の好きなタイミングでいつでも入出金できる」とはっきり書いてあります。 また、購入後のサポートページには「ポジション保有中の場合は、すべてのポジションが解消された後の停止作業となりますので予めご了承ください。」 とありますが、自分は停止申請した時点で、すべてのポジションを強制決済した後停止すると解釈していました。 販売ページに上記のような記述がありながら、実際にはシステムを停止できずどんどん損失が膨らんでいる状況にあります。 毎日新しいポジションを持つので、本当にすべてのポジションが決済される日がいつになるのか見当もつきません・・ 法的な手段に訴える等でもかまいませんので、なんとか全ての資金を失う前にシステムを止めさせることはできないでしょうか?

  • 初心者におすすめのプログラミング言語

    VBAでシフト表を自動作成できる物を作ったのですが、欲しい条件などを入れようと思ってもシステム的に難しかったり、処理が重かったりして不便なので、 初心者でもできるプログラミング言語を教えて欲しいです。

  • MT4の自動売買プログラムで出来る?勉強法は?

    FXをはじめてまだ日は浅いのですが・・・ 最近、シストレの広告などを見て、自分のルールをプログラム化する事が出来るのなら、チャートを見ることが出来ない時もエントリータイミングを逃すことが無く、いらない感情も発生せず、トレード出来るのかなという思いが頭をよぎり、MT4の自動売買のプログラミングに興味をもっています。 MT4についても詳しく知りませんし、プログラミングも無知の状態です。 そこで、ご存知の方がいらっしゃいましたら教えていただきたいのですが、MT4のプログラミングで下記の様な事がプログラム化できるのでしょうか。 例)  (1)ボリンジャーバンドの+2σと-2σのバンド幅が35pips以上ある時に+2σを抜けたらショート    エントリー。-2σを抜けたらロングエントリー。  (2)21移動平均線が下向きの状態でローロク足が移動平均線に達したらショートエントリー.。   逆ならロングエントリー。  (3)建玉数は資産の2%の金額÷損失pips数とする。  (4)ポジションが建った場合は指値+40pips、逆指値-30pipsにする。  (5)1日で2回負けたらその日はトレードしない。(若しくは1日のトレード回数は5回までとか) 出来るのであれば、プログラミングの勉強をしてみようかなと考えています。 又、MT4のプログラミングを勉強するにあたって、わかりやすく参考になる書籍やブログ等をご存知の方がいらっしゃいましたら、教えていただきますでしょうか。

  • メタトレーダー4の使い方

    こんにちは メタトレーダー4を使って、為替の自動売買がしたいです 15分足でRSIが80以上になったら、売り建てして、5銭利益が出たら、決済。 または15分足でRSIが20以下になったら、買い建てして、5銭利益が出たら、決済。 という自動売買をしたいのですが、どうやればいいのですか? プログラムを自分で組まなければいけないのですか? 不勉強ですいません。よろしくお願いします。

  • C++のプログラミングについての質問です。

    C++のプログラミングについての質問です。 f(x)=\int_{1}^{0} \frac{1+e^t}{\sin(xt)}dt -0.1=0 (式を皆さんに分かってもらえるように表記する方法が分からないため、TeX表記します。) このようになるようなx2の値を求めるプログラムを教えてください。 ちなみに、定積分は積分区間は100等分して、シンプソン法と狙い撃ち法を用いて プログラムを作ってください。 P.S 狙い撃ち法は簡単に言うと x2=\frac{f(x0)-f(x1)}{x1*f(x0) - x0*f(x1)} この式を使って後はシンプソン法で求めた値を上式に突っ込むだけです。 一応自分が考えたプログラムを載せます。 間違いがあればご指摘お願いします。 ↓ // kadai5.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { int t; double ta,x0=100,x1=x0-0.01,x2,S0=0,S1=0,Ds0,Ds1,fx0,fx1,y00,y01,y02,y10,y11,y12,esp=0.000001; for(;;){ for(t=0;t<=99;t=t+2){ ta=t*0.01; y00=sin(x0*ta)/(1+exp(ta)); y01=sin((x0+1)*(ta))/(1+exp(ta)); y02=sin((x0+2)*(ta))/(1+exp(ta)); Ds0=0.01*(y00+4*y01+y02)/3; S0=S0+Ds0; y10=sin(x1*ta)/(1+exp(ta)); y11=sin((x1+1)*(ta))/(1+exp(ta)); y12=sin((x1+2)*(ta))/(1+exp(ta)); Ds1=0.01*(y10+4*y11+y12)/3; S1=S1+Ds1; printf("S0=%lf \n S1=%lf",S0,S1); } fx0=S0-0.01; fx1=S1-0.01; x2=((x1*fx0)-(x0*fx1))/(fx0-fx1); printf("x=%lf \n",x2); if(fabs(x1-x2) <= esp)break; x0=x1; x1=x2; } return 0; }

  • プログラミングについて質問です。

    実は先日、授業で以下のような課題が出ました。 32*x^6-192*x^5+452*x^4-448*x^3+210*x^2-36*x+1=0 の 0≦X≦2 の中の解全てをNewton法で ・精度 ε = 10^(-6) 程度 ・Fortran等のプログラミング言語によってプログラムしそのリストを提出せよ。 一応、以下のように作ってみたんですが・・・ プログラム文(Java言語) public class Newton{ public static void main(String[]args){ double x,x_new; x=0; while(true){ x_new=x-(32*x*x*x*x*x*x+192*x*x*x*x*x+432*x*x*x*x+448*x*x*x+210*x*x+36*x+1)/(192*x*x*x*x*x+960*x*x*x*x+1728*x*x*x+1344*x*x+420*x+36); if(Math.abs(x_new-x)<Math.pow(10.0,-6)){ System.out.print("Answer x="); System.out.println(x); break; } else if(Math.abs(x_new-x)>Math.pow(10.0,5.0)){ System.out.println("No Solution"); break; } else{ x=x_new; } } } } 出力結果 x=-0.03407365205941606 という感じでやってみたんですけど、いまいち合ってるのかどうか分かりません。どなたかアドバイスください。

    • ベストアンサー
    • Java
  • メタトレーダーでCloseがある値を抜けたらフラッグを立てて、変更注文

    メタトレーダーでCloseがある値を抜けたらフラッグを立てて、変更注文が出せるプログラムを 考えています。簡単に書くと int start() { int Position=-1; int Flag; for(it=0;i<OrdersTotal();i++){ //ポジションチェック if(OrderSelect(i, SELECT_BY_POS) == false) break; if(OrderSymbol()==Symbol()) Position = i; } if(Position==-1){ポジションが無ければ注文。省略} else {   OrderSelect(Ticket,SELECT_BY_POS); //ポジション選択   if(OrderSymbol()==Symbol()){     double EntryPrice = OrderOpenPrice(); //オープン値 //50pips以上になったらストップロス値を変更 if(EntryPrice + 50 * Point < Close[0] && Flag == 0) { Flag = 1; double SL2 = EntryPrice; MyOrderModify(SL2, 0, MAGIC); } //100pips以上になったらストップロス値を変更 else if(EntryPrice + 100 * Point < Close[0] && Flag == 1) { Flag = 2; double SL3 = EntryPrice + 50 * Point; MyOrderModify(SL3, 0, MAGIC); } //--省略 以上です。このプログラムだとフラグを保持することができません。 ティックが変わるたびにstart()が呼ばれ、フラグは0になってしまいます。 もしいい方法がありましたらご教授ください。よろしくお願いします。

専門家に質問してみよう