KimIVの便利な機能 - ページ 4

 

SetOrder()関数のその他の使用例です。

わかりやすくするために、ストップロス/ステイクプロフィットの最小許容レベルをpips単位で大きく設定したシンボルを選択する必要があります。私が選んだテスト用の証券会社でのこのレベルは10ポイントであるAUDCADを選択しました。

1.ロット0.1、現在値より5pips下のBuyLimit注文を設定する。エラー130(Wrong stops)を出すために、わざと注文設定レベルを許容される最小レベルより低くして、SetOrder関数がどのようにそれを解決するのかを示しています。

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-5*Point);

プロトコルの内容(下から上へ読み上げます)。
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: 削除されました。
2008.03.17 09:06:24 stdlib AUDCAD,M5:削除しました。
2008.03.17 09:06:24 stdlib AUDCAD,M5: uninit reason 0.
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: open #21616412 buy limit 0.10 AUDCAD at 0.9180 ok.
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: SetOrder(): 価格水準を修正しました。
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.1 op=買い指値 pp=0.9185 sl=0 tp=0 mn=0
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 09:06:15 stdlib AUDCAD,M5: ロードに成功しました。
2008.03.17 09:06:14 test_SetOrder AUDCAD,M5: ロードに成功しました。

プロトコルは,この関数が0.9185の注文(pp=0.9185)を出そうとしたが,取引サーバーがその注文を受け付けず,エラー130を返したことを示している。その後、注文の設定レベルを最小許容レベルまで補正し、次の取引を成功させる機能です。注文は0.9180に設定しています。

2.ロット0.3のBuyStop注文を現在値より6pips上、ストップは9pipsに設定

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+6*Point, Ask+(6-9)*Point);

プロトコルの内容(下から上に読み上げます)。
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: 削除されました。
2008.03.17 09:27:36 stdlib AUDCAD,M5: 削除されました。
2008.03.17 09:27:36 stdlib AUDCAD,M5: uninit reason 0.
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: open #21617419 buy stop 0.30 AUDCAD at 0.9209 sl: 0.9195 ok
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: SetOrder(): 価格水準を修正しました。
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Ask=0.9198 Bid=0.9188 sy=AUDCAD ll=0.3 op=Buy Stop pp=0.9204 sl=0.9195 tp=0 mn=0
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 09:27:26 stdlib AUDCAD,M5: ロードに成功しました。
2008.03.17 09:27:25 test_SetOrder AUDCAD,M5: ロードに成功しました。

この例では、注文設定レベルが0.9204から0.9209に変更されたことを表しています。同時にストップの水準もsl=0.9195と変化していない。つまり、pips単位のストップが9から14に増えたのです。

 

3.現在値より8ポイント高い位置に0.5ロットのSellLimit注文を設定し、ストップは9ポイント、テイクオーダーは7ポイント。

SetOrder(NULL, OP_SELLLIMIT, 0.5, Bid+8*Point, Bid+(8-9)*Point, Bid-(8+7)*Point);

プロトコルの内容
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: 削除されました。
2008.03.17 10:38:50 stdlib AUDCAD,M5: 削除されました。
2008.03.17 10:38:50 stdlib AUDCAD,M5: uninit reason 0.
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 10:38:49 test_SetOrder AUDCAD,M5: open #21620553sell limit 0.50 AUDCAD at 0.9190 sl: 0.9201 tp: 0.9179 ok.
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: SetOrder(): 価格水準を修正しました。
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.5 op=Sell Limit pp=0.9188 sl=0.9197 tp=0.9179 mn=0
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1.
2008.03.17 10:38:40 stdlib AUDCAD,M5: ロードに成功しました。
2008.03.17 10:38:39 test_SetOrder AUDCAD,M5: ロードに成功しました。

この例でも、マーケットに近すぎる指値注文を設定しようとしています。注文設定レベルは0.9188から0.9190へ2pips上方修正されました。ストップレベルも調整されていますが、0.9197から0.9201と4ポイントも上昇しています。Takeレベルのみ変更なく、9から11pipsに増加しました。

もう十分な例だと思います。もう、かなり難解です。どのような結論が導き出されるのでしょうか。
1.この関数はそのタスクを完了するために最善を尽くし、すなわちオーダーを設定しようとする。変化する市場に合わせてレベルを調整し、何度でも仕事をしようとするのです。
2.ストップオーダーの設定レベル調整では、設定価格に対してストップレベルがポイントで上昇します。これは、ストップ注文の水準はそのままに、注文設定水準をストップ水準から遠ざけたことによるものです。買い注文の水準は上方に、売り注文の水準は下方にシフトしています。これらの注文設定レベルの操作は、注文設定レベルの調整値分だけポイントでのストップサイズを大きくします。
3.指値注文の設定水準を調整すると、設定価格に対して相対的にテイクラインの水準がポイントアップされます。これは次のような方法で実装されています。ティーはそのままに、ストップとセットアップのレベルを買い指値は上方、売り指値は下方に移動させます。取り込みポイントの大きさは、オーダー設定レベル補正の値によって増加します。

警告! SetOrder 関数のコードを数行入れ替えて変更しました。古い投稿は編集できないので、修正した機能をここに貼り付けています。また、SetOrder関数のオンラインテスト用スクリプトを添付します。


ファイル:
 

ModifyOrder 関数の公開を早めるために、しばらくはポジション関数に切り替えて、その後、オーダー関数に戻り、それで終わらせることにしました。

注意!
私は、ポジションを OP_BUYと OP_SELLの 取引操作と定義しています。ポジションのオープン、クローズを行います。
取引操作をOP_BUYLIMITOP_BUYSTOPOP_SELLLIMITOP_SELLSTOPと 呼び、注文と します。注文が入り、削除される。注文がトリガーされると、それはポジションとなります。

ExistPositions()関数です。

この機能は、買いまたは売りのオープンポジションがあるかどうかを確認するためのものです。ExistOrders 関数に似ている。デフォルトでは、カレントとその他のすべてのポジションをチェックします。フィルター-機能パラメーターの組み合わせで選択範囲を絞り込むことができます。

  • sy- 楽器の名称に制限を加える。デフォルトのパラメータは""で、制限なし、つまりどんな楽器でもOKです。NULLを渡すと、ポジションの選択は現在の楽器に限定されます。
  • op- ポジションタイプ(買い/売り)に制限を設けます。デフォルトでは、制約がない、つまり、どのポジションのタイプもチェックされる。このパラメータに有効な値は-1、OP_BUY、OP_SELLです。
  • mn- ポジションの識別("マジック")番号の制限を適用します。デフォルトでは制約がなく、任意のマジックナンバーの位置がチェックされます。
  • ot- ポジションオープン時間の制限を適用します。このパラメータの値より後にポジションが開くかどうかチェックされます。デフォルトでは制約なし、つまり任意のオープンタイムを持つポジションがチェックされます。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 

ExistPositions()関数の使用例です。

1.任意の位置の存在を確認する

ExistPositions();

2.現在のチャートシンボル上の任意の位置の存在確認

ExistPositions(NULL);

3.あらゆる楽器で購入の有無を確認する

ExistPositions("", OP_BUY);

4.EURUSDでマジックナンバー123456の売りがあるか確認する

ExistPositions("EURUSD", OP_SELL, 123456);

5.開始時刻が 15分以上前のポジションの有無の確認

ExistPositions("", -1, -1, TimeCurrent()-15*60);

トレイラーには、ExistPositions関数をテストするためのスクリプトが含まれています。最初の4つの例はコメントアウトされています。

ファイル:
 
申し訳ありませんが、OrderSet_1もOrderSet_2も動作しません!エラーが発生する - コンパイルできない!どうしたらいいんだろう?
 
SoloEgoist:
申し訳ありませんが、OrderSet_1もOrderSet_2も動作しません!エラーが発生する - コンパイルできない!どうしたらいいんだろう?
OrderSet_1 または OrderSet_2 ファイルは、異なるバージョンのOrderSet 機能のソースコードです。ソースコードだけでいいんです。コンパイルできない、正しく実行できない(エラーが出ない)。少なくとも成果を得るためには、OrderSet 関数を使用した動作環境も構築する必要があります。test_SetOrderで そのような動作環境の例を作りました。
 
ありがとうございます。 なるほどー、やってみます!ただ、言葉があまりわからないので。
 

日付や 時刻を 扱う機能や方法があれば便利なのですが...。

例えば、こんな感じです。
- 現在時刻から2時間引く
- 有効期限まであとX日...

あと・・・関係あるかどうかわかりませんが・・・。:(

統計のための関数。例えば、こんな感じです。
- 毎週月曜日21時のローソク足が何本か
- そのうち215強気、245弱気
- 強気ローソク足: 最小値12 pips 最大 54 pips
- など...

または
- その日の最初の15Hローソクの安値が、2本目よりX回高い/低い。

重要なのは関数そのものではなく、どのように作るかであり、独自の関数を実装する方が簡単なのです。
プログラミングを学びながら...
またまた愚痴です :)) いろんなことがよくわからなくなるときがあるので、Cの本が役に立つかもしれませんね。
もちろん読んでもいいのですが、μl4だけに注目して、不要な情報で頭をいっぱいにする必要があるのでしょうか?
どのような不明瞭さですか?例えば、次のようなものです。

 
kombat:

日付や 時刻を 扱う機能や方法があれば便利なのですが...。

例えば、こんな感じです。
- 現在時刻から2時間引く
- 有効期限まであとX日...。

...


このような関数を書く必要はなく、非常に簡単な方法で解決できます。


int gHour = 2;
datetime gTwoHour ;


gTwoHourTime = TimeCorrent() - ((86400)/24)* gHour ); // 2時間
gTwoHourTime = TimeCorrent() - 7200; // 同じですが、負荷計算を行いません。

つまり、1日に86400ティックを取得します。

ということは、2時間=7200ティック、すなわち、86400/24 * 2 = 7200となります。
1時間=3600、など。
 
kombat:

日付や 時刻を 扱う関数や方法があると便利です。

統計のための関数。例えば、こんな感じです。
- 何時の間にかローソク足
- そのうち215強気、245弱気
- 強気ローソク足: 最小値12 pips 最大 54 pips
- など...

または
- その日の最初の15Hローソクの安値が、2本目よりX回高い/低い。

重要なのは関数そのものではなく、どのように作るかであり、独自の関数を実装する方が簡単なのです。
プログラミングを学びながら...

よくぞ言ってくれた...:-)

kombat wrote (a):
また愚痴ります :)) たまによくわからないことがあり、Cの本が役に立つと言われます。
C言語の本がたくさんあって参考になると指摘されていますが、もちろん読めばいいのですが、µl4だけに注目して、余計な情報で頭をいっぱいにする必要があるのでしょうか?
どのような不明瞭さですか?例えば、次のようなものです。

論理的なOR なんです。例を挙げて説明しよう。MQL4の「x>2またはx<-3のとき、x=5」式は、次のような形式になります。

if (х>2 || х<-3) х=5;