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

 
borilunad:
あれやこれやと、他の関数への不必要な呼び出しが多く、その結果エラーが発生するのです。

まあ、すでに失敗しているわけですが......。

シンプルでわかりやすい。自分の好きなように編集できる。

 
KimIV:


これに 似たものを描けるかどうか...。

更新

ExistOPNearPrice()関数をテストするためのスクリプトを添付しています。

作ってみたが、正しいかどうかわからない。

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает флаг существования позиции или ордера в заданном    | 
//|           : диапазоне от заданной цены                                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    op - торговая операция               (    -1      - любая операция)     |
//|    mn - MagicNumber                     (    -1      - любой магик)        |
//|    price - заданная цена                (    -1 - текущая цена рынка       |  
//|    ds - расстояние в пунктах от цены    (  1000000   - по умолчанию)       |
//+----------------------------------------------------------------------------+
bool ExistOPNearMarkets(string sy="", int op=-1, int mn=-1, double price = -1, int ds=1000000) {
  int i, k=OrdersTotal(), ot;

  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.00001; else p=0.001;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (OrderSymbol()==sy) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (op==OP_BUY && (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP)) {
            if ((price<0 && MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) ||
                (price>0 && MathAbs(price-OrderOpenPrice())<ds*p)) 
               {
                return(True);
               }
          }
          if (op==OP_SELL && (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP)) {
            if ((price<0 && MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) ||
                (price>0 && MathAbs(OrderOpenPrice()-price)<ds*p)) 
               {
                return(True);
               }
          }
        }
      }
    }
  }
  return(False);
}
 
artmedia70:

まあ、すでに失敗しているわけですが...。

シンプルでわかりやすいのは、自分に合った調整をすることです。

ありがとうございます。そう、もう他の仕掛けでやりくりしているのです。
 
khorosh:

やった、正しいかどうかわからないけど。

合っているような気がするのですが・・・。それは世界共通です )))
 

CorrectingPrice()。


あるEAで、「Invalid Stops」 エラー130 個を激減させる必要があったことがあります。小さなストップやテイクポイントを使うべきではない、STOPLEVELという トレードサーバーの設定でその最小値に制限がある、という私の主張は、お客様を納得させることはできなかったようです。結局、サーバーに取引要求を出す前に、このエラーを何とか処理できないかと考えたのだ。パクリました!エラーが出なければ、どうやって処理するのでしょう。しかし、ある考えが脳裏に浮かび、それが動き出し、この機能が誕生したのです。

CorrectingPrice() 関数は、サーバーに取引要求を送信する前、つまり初期データを準備する前に、注文とポジションの主要な価格水準をSTOPLEVELの 要件に合うように修正するためのものです。

この関数のパラメータはすべて必須であり、デフォルト値は存在しない。さらに、最後の3つのパラメータは参照渡しで、つまり、関数の作業結果を含むことになります。この関数は、以下のパラメータを受け付ける。
  • sy- 取引商品の名前。空の値「"」またはNULLは、現在の取引商品(シンボル)を示します。
  • op- 貿易業務。OP_BUY、OP_SELL、OP_BUYLIMIT、OP_SELLLIMIT、OP_BUYSTOP、OP_SELLSTOPが使用可能です。
  • pp- ポジション/注文の開始/設定価格です。
  • sl- ストップロスの価格水準。
  • tp- TakeProfitの価格水準。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.07.2013                                                     |
//|  Описание : Выполняет корректирование ценовых уровней под STOPLEVEL.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование торгового инструмента                                 |
//|    op - торговая операция                                                  |
//|    pp - цена открытия/установки                                            |
//|    sl - ценовой уровень StopLoss                                           |
//|    tp - ценовой уровень TakeProfit                                         |
//+----------------------------------------------------------------------------+
void CorrectingPrice(string sy, int op, double& pp, double& sl, double& tp) {
  if (sy=="" || sy=="0") sy=Symbol();
  RefreshRates();
  int    di=MarketInfo(sy, MODE_DIGITS);
  int   msl=MarketInfo(sy, MODE_STOPLEVEL);
  int    sp=MarketInfo(sy, MODE_SPREAD);
  double mp=MarketInfo(sy, MODE_POINT);
  double pa=MarketInfo(sy, MODE_ASK);
  double pb=MarketInfo(sy, MODE_BID);
  double ds=NormalizeDouble(pp-sl, di);
  double dp=NormalizeDouble(pp-tp, di);

  if (msl==0) msl=2*sp;
  switch (op) {
    case OP_BUY:
      pp=pa;
      sl=pp-ds;
      tp=NormalizeDouble(pp-dp, di);
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_SELL:
      pp=pb;
      sl=NormalizeDouble(pp-ds, di);
      tp=pp-dp;
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    case OP_BUYLIMIT:
      if (pp>pa-msl*mp) {
        pp=pa-msl*mp;
        sl=pp-ds;
        tp=NormalizeDouble(pp-dp, di);
      }
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_BUYSTOP:
      if (pp<pa+msl*mp) {
        pp=pa+msl*mp;
        if (sl>0) sl=pp-ds;
        if (tp>0) tp=NormalizeDouble(pp-dp, di);
      }
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_SELLLIMIT:
      if (pp<pb+msl*mp) {
        pp=pb+msl*mp;
        sl=NormalizeDouble(pp-ds, di);
        tp=pp-dp;
      }
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    case OP_SELLSTOP:
      if (pp>pb-msl*mp) {
        pp=pb-msl*mp;
        sl=NormalizeDouble(pp-ds, di);
        tp=pp-dp;
      }
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    default:
      Message("CorrectingPrice(): Неизвестная торговая операция!");
      break;
  }
}

 
KimIV:

CorrectingPrice()。


あるEAで、「Invalid Stops」 エラー130 個を激減させる必要があったことがあります。小さなストップやテイクを使うべきでない、その最小値はSTOPLEVELという トレードサーバーの設定で決まっている、という私の主張は、お客様を納得させることはできませんでした。結局、サーバーに取引要求を出す前に、このエラーを何とか処理できないかと考えたのだ。パクリました!エラーが出なければ、どうやって処理するのでしょう。しかし、ある考えが脳裏に浮かび、それが動き出し、この機能が誕生したのです。

CorrectingPrice() 関数は、サーバーに取引要求を送信する前、つまり初期データを準備する前に、注文とポジションの主要な価格水準をSTOPLEVELの 要件に合うように修正するためのものです。

この関数のパラメータはすべて必須であり、デフォルト値は存在しない。さらに、最後の3つのパラメータは参照渡しで、つまり、関数の作業結果を含むことになります。この関数は、以下のパラメータを受け付ける。
  • sy- 取引商品の名前。空の値「"」またはNULLは、現在の取引商品(シンボル)を示します。
  • op- 貿易業務。OP_BUY、OP_SELL、OP_BUYLIMIT、OP_SELLLIMIT、OP_BUYSTOP、OP_SELLSTOPが使用可能です。
  • pp- ポジション/注文の開始/設定価格です。
  • sl- ストップロスの価格水準。
  • tp- TakeProfitの価格水準。

イゴール、証券会社によってはStopLevelの代わりにSpread*2を使っていて、その値はゼロです。ざっとコードを見直したところ、このような状況でのチェックは気がつきませんでした。この状況を確認するためにコードを修正するのが良いと思います。そうしないと同じ130エラーが発生します。
 
artmedia70:
イゴール、証券会社によっては、値がゼロのStopLevelの代わりにSpread*2を使っているところもあるんだ。コードをざっと見たところ、このような状況に対するチェックはありませんでした。この状況を確認するために、コードを微調整するのがいいと思います。そうしないと、同じ130のエラーが発生します。


アルテム そんなDCは初めてだ...。個人的なメッセージで2、3個送ってもらえますか?貿易規則を読むと・・・。

それとも、もっとシンプルな方法があるのでしょうか?そのような補正をするほど正しいのか、教えてください。

int   msl=MarketInfo(sy, MODE_STOPLEVEL);
int    sp=MarketInfo(sy, MODE_SPREAD);
if (msl==0) msl=2*sp;

UPDATE:CorrectingPrice() 関数を修正しました。

 

CorrectTF()関数の新バージョンです。

以前、私はCorrectTF() 関数について、その名前と機能が一致しないと批判されたことがあります。実際には、最も近い最小値まで時間枠を調整するのであって、最も近いものだけを調整するのではありません。標準時間軸間の算術平均値を計算し、その説明に従って関数を書き換えています。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.05.2013                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество минут).                               |
//+----------------------------------------------------------------------------+
int CorrectTF(int TimeFrame) {
  if (TimeFrame>     1 && TimeFrame<    3) return(PERIOD_M1);
  if (TimeFrame>=    3 && TimeFrame<   10) return(PERIOD_M5);
  if (TimeFrame>=   10 && TimeFrame<   23) return(PERIOD_M15);
  if (TimeFrame>=   23 && TimeFrame<   45) return(PERIOD_M30);
  if (TimeFrame>=   45 && TimeFrame<  150) return(PERIOD_H1);
  if (TimeFrame>=  150 && TimeFrame<  840) return(PERIOD_H4);
  if (TimeFrame>=  840 && TimeFrame< 5760) return(PERIOD_D1);
  if (TimeFrame>= 5760 && TimeFrame<26640) return(PERIOD_W1);
  if (TimeFrame>=26640                   ) return(PERIOD_MN1);
}
 
KimIV:


アルテム そんなDCは初めてだ...。個人的なメッセージで2、3個送ってもらえますか?取引規制を読んでみる・・・。

落下

あるいは、もっとシンプルなものでもよいでしょう。そのような補正をするほど正しいのか、教えてください。

int   msl=MarketInfo(sy, MODE_STOPLEVEL);
int    sp=MarketInfo(sy, MODE_SPREAD);
if (msl==0) msl=2*sp;

もちろん、すべて正しいです。

UPDATE:CorrectingPrice() 関数を修正しました。

イゴール 私もEAでは実質的に同じように、必ず最初にデータを読み込んで、必要な値を変数レベルに 代入し、それで計算を確認するようにしています。
 
KimIV:


アルチョム そういうDCには出会っていないんですが...。個人的なメッセージで2、3個送ってもらえますか?取引規制を読んでみる・・・。

あるいは、もっと簡単な方法で行うこともできます。このような修正案を使うほど正しいのか、自分で言ってみてください。

UPDATE:CorrectingPrice() 関数に修正を加えました。

同僚の皆さん、こんにちは。私はまだコードを勉強中で、微妙なところがよく理解できず、ちょっと困っています。

私の理解では、注文する前にこの関数を呼び出してパラメータを修正する必要があります。

注文を開けるには、このような行程があります。

if(buy == true && Open[0]>UpTr && Trade) { (買い == 真 && Open[0]>UpTr && トレード)

buy=OrderSend(Symbol(),OP_BUYSTOP,LOT(),NormalizeDouble(op,桁数),slippage,NormalizeDouble(sl,桁数),NormalizeDouble(tp,桁数), "T",Magic,0,MediumBlue).Of.Pirates;

は、ここで対処すべきなのでしょうか?そして、その正しい方法。それとも、このコマンドはCorrectingPrice() を必要としないのでしょうか?

よろしくお願いします。