どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 198

 
Atlis:

こんにちは。

次のようなことを実現するためのアドバイスをお願いします。

1.9047と1.9080の間で推移(数値は任意)。次のローソク足の始値がこの範囲から外れた場合、アラートを出します。そうでない場合は、次のローソク足を待ちます。そして、価格がレンジから離れるまで。

よろしくお願いします。


   if (Open[0]<1.9047) Alert("Цена ниже заданного диапазона");
   if (Open[0]>1.9080) Alert("Цена выше заданного диапазона");
これはあくまでコンセプトです。条件を満たした場合、毎回のティックに アラートが表示されます。
 

ここにコードの一部があり、そのデータを使って解析が行われます。

   if (CurTime() == tm2)              //tm1 и tm2 - заданное время
   {
   //ObjectCreate("line2",OBJ_VLINE,0,tm1,0);
   price1=iHigh(Symbol(),PERIOD_M30,1);
   //ObjectCreate("highLine",OBJ_HLINE,0,0,price1);
   price2=iLow(Symbol(),PERIOD_M30,1);
   //ObjectCreate("lowLine",OBJ_HLINE,0,0,price2);
   Alert("price1=",price1);
   Alert("price2=",price2);
   }

すなわち、さらにコードは次のようになります。

 if (Open[0]<price2) Alert("Цена ниже заданного диапазона");
 if (Open[0]>price1) Alert("Цена выше заданного диапазона");

そして、ここで問題になるのが、「どこにどのように置くか」ということです。条件内の場合、アラートは表示されず、条件外の場合、すべてのティックで アラートが表示されます。

私の質問の仕方が間違っていたようで、申し訳ありませんでした。

 
Atlis:

ここにコードの一部があり、そのデータを使って解析が行われます。

すなわち、さらにコードは次のようになります。

そして、ここで問題になるのが、「どこにどのように置くか」ということです。条件内の場合、アラートは表示されず、条件外の場合、すべてのティックでアラートが表示されます。

私の質問の仕方が間違っていたようで、申し訳ありませんでした。

タイムチェックの条件を中に入れると、価格が範囲外の場合にのみ価格アラートが表示されます
 
ありがとうございます、解決したようです。しかし、もう一つ質問があります。現在、アラートは与えられた時間間隔から、「停止」までの範囲を超えた場合に出力されています。最初の値が条件を満たしたときに、この「検索」を停止させる方法はありますか?
 
Atlis:
ありがとうございます、整理しました。ここでまた質問ですが、現在、アラートは指定した時間間隔から、「停止」までの範囲を超えた場合に発生します。最初の値が条件を満たしたときに、この「検索」をどうにかして止めることはできないでしょうか?

まあ、一定期間、ずっとそうである主な条件を理解する必要があります。例えば-時間の比較。すべてのアラートを発行した後、現在時刻を比較する変数に新しい値を代入する必要があります。新しいバーを定義する機能を探します。その構造のコンセプトが参考になるはずです。

こちらも お読みいただけましたか?

 

未決済注文を 発注するための最短距離は、どのように知ることができますか?

 
Elektronik:

未決済注文を発注するための最短距離は、どのように知ることができますか?

int level=MarketInfo(Symbol(), MODE_STOPLEVEL)とする。

StopLevelが0であれば、level=MarketInfo(Symbol(), MODE_SPREAD)*2である可能性が高い。

アルパリは間違いなくStopLevelとして見開き2枚を使用しています。

距離の測定はこちらを ご覧ください。

 

artmedia70 さん、ありがとうございました。

 
artmedia70:

isCloseLastPosByStop () 関数から真の値を返すとき、もう1つの値、つまり最後に見つかった位置のロットサイズを返します。

どうすればいいのか?関数に変数を参照で渡し、その中にロットサイズを関数自体に書き込む。そのためには、関数isCloseLastPosByStop()を少し修正する必要があります。

何もわからなければ、最後に決済したポジションのロットサイズを返す関数を探します。自分で作ることもできます。そしてそれを使うのですが、これはロット値を一緒に渡すよりもコストがかかるので、trueの

私は、関数の代わりにTrue関数が変数ロットを返すように、関数自体を私はロットのサイズを書いている変更しました。

全てコンパイルされるが、注文が開けない。

2013.10.23 20:57:46 2011.02.24 16:25 GMT EURUSD,M5:OrderSend error 4051

2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5: OrderSend 関数の 無効なロット数

if(isCloseLastPosByStop ()== lot )         //если последний ордер закрылся по стопу
{
P=lot*2;                                      //открыть ордер объемом = объему закрытому по стопу ордеру умноженному на 2                                  
OrderSend(Symbol(),OP_SELL,P,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else                                         //если последний ордер закрылся не по стопу
{

P=0.1;  
OrderSend(Symbol(),OP_SELL,1,Bid,P,Ask+1500*Point,Ask-300*Point,"jfh",123 );   //открыть ордер обычным объемом 0.1
}
   return(0);
  }
//============================================================  
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp,lot, osl;                                             // добавил переменную - количество лотов в оредере
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl)
    lot=OrderLots( ) ;                              //добавил вычисление количества лотов в ордере который закрылся по стопу.
    return(lot);                                    // вместо возвращаемого функцией значения True вставил переменную lot со значением количества лотов
  }
  return(False);
}

私の間違いが何なのか教えてください。

ありがとうございます。

 
solnce600:

私はこの関数を変更し、Trueの代わりにロットという変数を返すようにし、関数自体にロットサイズを書きました。

すべてコンパイルされますが、ジャーナルによると、注文は開かれません。

2013.10.23 20:57:46 2011.02.24 16:25 EURUSD,M5:OrderSend error 4051

2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5:OrderSend 関数の無効なロット数

何が間違いなのか、ご指導ください。

ありがとうございます。


stop で最後に閉じた位置を 決定する関数は bool 型ですが、double 型を返そうとしているのですね。これに対応して、0または1のいずれかが返される。

その中に1つの変数の参照渡しを加えるべきと書きました。

//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      t, dg, i, j=-1, k=OrdersHistoryTotal()-1;

   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op           continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss()<0.5*pt)) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
//+----------------------------------------------------------------------------+

では、最後の「Buy」を例に確認してみましょう。

//+----------------------------------------------------------------------------+
double Lot=MarketInfo(Symbol(), MODE_MINLOT);            // задаём минимальное значение переменной
if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot)) {// в переменную Lot будет записано значение лота закрытой позиции
   // Если последний закрытый Buy закрыт по стопу
   Lot= //... эта переменная содержит размер лота закрытой позиции, выполняете нужные вычисления с этой переменной
   }
//+----------------------------------------------------------------------------+

このように...