為替ロボット 研究所

2005年06月08日

プログラミングしてみよう

StrategyBuilderFXのExpertを作成する言語はMQLⅡというものです。

これはエクセルのマクロなどで使えるVBScriptによく似た書式ですので、経験のある方にはそれほど難しくないと思います。


投稿者 kawarobo : 09:49 | コメント (0) | トラックバック

MACD Sampleの中身1

MQLⅡプログラミングの参考にMACD Sampleの中身を見てみましょう。

MetaEditorのメニュー
 File > Open
から、MACD Sample.mqlを開きます。

*SBFXのNavigatorウィンドウから
  ExpertAdvisors > MACD Sample (右クリック)> Modify
 でも開けます。

macdsample1


【MACDSampleの売買ルール】


  • ポジションは1つだけ。複数ポジションは持たない。
  • ポジションが無い場合、
     MACDの絶対値がオープンレベル(MACDOpenLevel)pipsより大きい地点で、
     MACDが正で、シグナルを上回ったとき、MAも上昇中なら 買い。
     MACDが負で、シグナルを上からクロスしたとき、MAも下降中なら 売り。

  • ポジションがある場合
    MACDの絶対値がクローズレベル(MACDCloseLevel)pipsより大きい地点で、
     買いポジなら、MACDが正で、シグナルを下回ったとき、閉じる。
     売りポジなら、MACDが負で、シグナルを上回ったとき、閉じる。

  • トレーリングストップの採用が可能。
  • トレーリングストップを設定していないならストップ値はなし。
  • 目標利益幅(TakeProfit)は10pips以上で一定値に固定。
  • 余剰証拠金が1000以上必要。
  • MACD算出のため、ヒストリカルデータの数200以上が必要。

次では、実際のMQLⅡコードを見ながら内容を確認していきます。


投稿者 kawarobo : 10:09 | コメント (0) | トラックバック

2005年06月15日

MACD Sampleの中身2

MACDサンプルのコードを見てみましょう。

~ MACD Sample.mql ~
/*[[
   Name := MACD Sample
   Author := Copyright ゥ 2002, MetaQuotes Software Corp.
   Link := http://www.metaquotes.ru
   Notes :=
   Lots := 1
   Stop Loss := 0
   Take Profit := 40
   Trailing Stop := 0
]]*/

// ↑は特殊なコメント行。デフォルトのLot数など特別なパラメをセット
//------------------------------------
//定数・変数の宣言。
//defines: やvar:に続けて宣言する.
//「,」で区切って複数まとめて宣言も可
//------------------------------------
defines: MACDOpenLevel(3),MACDCloseLevel(2);
defines: MATrendPeriod(56);

// ↑定数を列挙。プロパティ画面から値を変更できる。
// ()はデフォルト値。MQLⅡでは数字のみ。文字列は不可。
// 定数はプログラム内からの変更不可。

var: MacdCurrent(0),MacdPrevious(0);
var: SignalCurrent(0),SignalPrevious(0);
var: MaCurrent(0),MaPrevious(0);
var: cnt(0);

// ↑変数を列挙。
// ()は初期値。文字列の場合は""でくくる。例 test("abc")

//------------------------------------
//ここから下がTickデータ更新ごとに実行.
//変数の値はずっと保持される
//------------------------------------

つづく


投稿者 kawarobo : 00:56 | コメント (0) | トラックバック

MACD Sampleの中身3

//IF文による条件分岐
// その時点でのデータ数が少ない(=200より小)か、
// 目標利益幅が小さすぎる(=10pips未満)場合は終了
If Bars<200 or TakeProfit<10 then Exit;

// iMACD()でMACDチャートの各値を算出。
MacdCurrent=iMACD(12,26,9,MODE_MAIN,0);//現在のMACD値
MacdPrevious=iMACD(12,26,9,MODE_MAIN,1);// 一つ前のMACD値
SignalCurrent=iMACD(12,26,9,MODE_SIGNAL,0);//現在のシグナル値
SignalPrevious=iMACD(12,26,9,MODE_SIGNAL,1);//一つ前のシグナル値

// iMA()は移動平均MovingAverageの各値を算出
MaCurrent=iMA(MATrendPeriod,MODE_EMA,0);//現在のEMA値
MaPrevious=iMA(MATrendPeriod,MODE_EMA,1);//一つ前のEMA値

//ここからは、ポジションを持つ条件を設定している

If TotalTrades<1 then
 //TotalTrades= 保有ポジションと未約定オーダー数
 // 保有ポジションや未約定のオーダーがなければ
 // 「ここから1」~「ここまで1」を実行
 // ⇔既にポジションがある場合は実行されない
{ //ここから1
 If FreeMargin<1000 then Exit;
 // 余剰証拠金が1000未満の場合終了
// If((CurTime-LastTradeTime)<300) { Exit }
 //(↑この行は無効化されている)
 // LastTradeTime=直近のオーダー発注時刻(単位は秒)。

 If MacdCurrent<0 and MacdCurrent&rtSignalCurrent and
  MacdPrevious<SignalPrevious and
  Abs(MacdCurrent)&rt(MACDOpenLevel*Point) and
  MaCurrent&rtMaPrevious then

 // Point=1pipの値.
 // MACD現在値が0より小かつシグナルより大で、MACD過去値がシグナルより小で、
 // MACD絶対値が開始レベルポイントを超えている、
 // MA現在値がMA過去値を越えた場合
 //「ここから1_1」~「ここまで1_1」を実行

 // (=MACDが負の場合、
 // MACDがシグナルを下から上へクロスした時に、
 // MACD絶対値が十分大きく、MAが上昇中なら
 // 買いオーダー出す)
 { //ここから1_1
  SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED);
  // SetOrder=注文を出す
  // 成り行き買い注文(数量=Lots,スリッページ3,
  // ストップ=なし,リミット= 現値+TakeProfit pips)
  Exit; // 終了

 }; //ここまで1_1


 If MacdCurrent&rt0 and MacdCurrent<SignalCurrent and
  MacdPrevious&rtSignalPrevious and
  MacdCurrent&rt(MACDOpenLevel*Point) and
  MaCurrent<MaPrevious then

 //以上条件満たせば「ここから1_2」~「ここまで1_2」実行
 // (=MACDが正の場合、
 // MACDがシグナルを上から下へクロスした時に
 // MACD絶対値が十分大きく、MAが下降中なら
 // 売り。)
 { //ここから1_2
  SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED);
  // 成り行き売り注文
  //(数量=Lots,スリッページ3,
  // ストップ=なし,リミット= 現値+TakeProfit pips)
  Exit; // 終了
 }; //ここまで1_2

 // どちらの条件にもあてはまらなければ終了
 Exit;
};
//ここまで1


つづく


投稿者 kawarobo : 02:01 | コメント (0) | トラックバック

MACD Sampleの中身4

//print("Check: ",TotalTrades);//デバッグ用。Printは文字列を表示する
//PrintTrade(1);//デバッグ用。直近のポジション情報を表示

//ここからはポジションを閉じる条件を設定している

for cnt=1 to TotalTrades
//Forで指定回数繰り返す
//現在のポジション&未決オーダー数ぶん、以下を繰り返し実行
{ //forのはじまり
 if OrderValue(cnt,VAL_TYPE)<=OP_SELL and
  OrderValue(cnt,VAL_SYMBOL)=Symbol then

 //OrderValue=ポジションの情報を得る。
 //OP_BUY < OP_SELL < OP_BUYLIMIT < OP_SELLLIMIT < OP_BUYSTOP < OP_SELLSTOP の関係。
 //現在選択中のシンボル(通貨組み合わせ)でポジションがあるなら、の意。
 { // 2
  If OrderValue(cnt,VAL_TYPE)=OP_BUY then // 買いポジションなら
  { // 2_1
   // 現在MACDが正で、MACDがシグナルを上から下へクロスし、
   // MACD絶対値がクローズレベルを超えているなら、ポジションを閉じる
   If MacdCurrent&rt0 and MacdCurrent<SignalCurrent and
    MacdPrevious&rtSignalPrevious and
    MacdCurrent&rt(MACDCloseLevel*Point) then

   { // 2_1_1
    CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
    // CloseOrder=ポジションを閉じる
    Exit; //終了
   }; // 2_1_1

   // (2_1_1に当てはまらなかった場合ここに来る)
   // トレイリングストップが設定されている場合はストップ値を変更
   If TrailingStop&rt0 then
   {
// 2_1_2
    If (Bid-OrderValue(cnt,VAL_OPENPRICE))&rt(Point*TrailingStop) then
    //売値-ポジの買値>トレーリングストップ値より大なら
    { // 2_1_2_1
     If OrderValue(cnt,VAL_STOPLOSS)<(Bid-Point*TrailingStop) then
     //ポジのストップ値がまだ引き上げられていないなら
      { // 2_1_2_1_1
ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
      //ストップ値を編集。ストップ値を引き上げる
      //ModifyOrder=オーダーを変更
      Exit;
     }; //2_1_2_1_1
    }; // 2_1_2_1
    }; // 2_1_2
  } // 2_1
  else // 売りポジションなら
  { // 2_2
  // 現在MACDが負で、MACDがシグナルを下から上にクロスし、
  // MACD絶対値がクローズレベルを超えているなら、ポジションを閉じる
   If MacdCurrent<0 and MacdCurrent&rtSignalCurrent and
    MacdPrevious<SignalPrevious and
    Abs(MacdCurrent)&rt(MACDCloseLevel*Point) then
   {
// 2_2_1
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);
    Exit;
// 終了
   }; // 2_2_1
   // そうでないなら
   If TrailingStop&rt0 then
   //トレーリングストップ設定あればストップ値編集
   { // 2_2_2
    If (OrderValue(cnt,VAL_OPENPRICE)-Ask)&rt(Point*TrailingStop) then
    {
//2_2_2_1
     If OrderValue(cnt,VAL_STOPLOSS)=0 or
      OrderValue(cnt,VAL_STOPLOSS)&rt(Ask+Point*TrailingStop) then
     {
// 2_2_2_1_1
ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),Ask+Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
      Exit;
     };
// 2_2_2_1_1
    }; // 2_2_2_1
   }; // 2_2_2
  }; // 2_2
  }; // 2
}; // forの終わり
// the end.


投稿者 kawarobo : 02:02 | コメント (0) | トラックバック

MQLⅡ簡易リファレンス

MQLⅡの特徴的な部分を挙げておきます。


  • 変数は使用前に宣言しておく
     var: i(0); ←( )内は初期値
     var: j(1);
     vars: i(0), j(1); のように「,」で区切って一行に書いてもOK。
     Array: i[10](0); 配列はこのように宣言。
     Arrays: i[5](3), J[10]("");

  • 文末には必ず「;」を付ける
     i=2;
     If i==2 then{ …} ;

  • IF文の「;」に注意(for文While文なども)
     If i==1 then j=1 ;
     If i==1 then j=1 else j=2 ;
     If i==1 then {
      j=1;k=1;
     }else{
      j=2;
      k=2;
     };
     for i=0 to 10 {
      ・・・
     };

  • 大文字小文字は区別されない
     変数I と変数iは同じ変数として扱われる

  • コメントは頭に「//」。または「/*」「*/」でくくる
     //ここはコメント。プログラム上では無視
     /* 複数行にまたがるときは
    このように使用 */
     
  • 文字列は「” ”」でくくる
     print(“Hello”);
     I=”test”;

  • 終了は「Exit」
     if I==”test” then Exit;

  • ExpertはTickデータ更新ごとに実行される。変数は宣言時に初期化され、以降は値が保持される
     var: i(0);
     i=i+1;
     print(i);
     //実行されるごとにiの値が増え、1,2,3,...と値が増えていく

  • 変数は初期値によって型が決まる。あとから代入しようとする値と型が一致しないと予期しない値になる。
     var:i(1),J(“test”); // iは数値、Jは文字列
     i = J;
     print(i); //結果、「test」 ではなく「0」が表示される

  • ++ や +=, *=などが使える
     i++; ⇔ i=i+1;
     i+=2; ⇔ i=i+2;
     i*=3; ⇔ i=i*3;

  • 文字列の結合は「+」
     var: I(”abc”),J(“”) ;
     J = I + ”def” ;
     Print(J); //結果、「abcdef」が表示される

その他詳細は MQLⅡ覚え書き へ


投稿者 kawarobo : 02:09 | コメント (0) | トラックバック