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);
}
//+----------------------------------------------------------------------------+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= //... эта переменная содержит размер лота закрытой позиции, выполняете нужные вычисления с этой переменной
}
//+----------------------------------------------------------------------------+
こんにちは。
次のようなことを実現するためのアドバイスをお願いします。
1.9047と1.9080の間で推移(数値は任意)。次のローソク足の始値がこの範囲から外れた場合、アラートを出します。そうでない場合は、次のローソク足を待ちます。そして、価格がレンジから離れるまで。
よろしくお願いします。
ここにコードの一部があり、そのデータを使って解析が行われます。
すなわち、さらにコードは次のようになります。
そして、ここで問題になるのが、「どこにどのように置くか」ということです。条件内の場合、アラートは表示されず、条件外の場合、すべてのティックで アラートが表示されます。
私の質問の仕方が間違っていたようで、申し訳ありませんでした。
ここにコードの一部があり、そのデータを使って解析が行われます。
すなわち、さらにコードは次のようになります。
そして、ここで問題になるのが、「どこにどのように置くか」ということです。条件内の場合、アラートは表示されず、条件外の場合、すべてのティックでアラートが表示されます。
私の質問の仕方が間違っていたようで、申し訳ありませんでした。
ありがとうございます、整理しました。ここでまた質問ですが、現在、アラートは指定した時間間隔から、「停止」までの範囲を超えた場合に発生します。最初の値が条件を満たしたときに、この「検索」をどうにかして止めることはできないでしょうか?
まあ、一定期間、ずっとそうである主な条件を理解する必要があります。例えば-時間の比較。すべてのアラートを発行した後、現在時刻を比較する変数に新しい値を代入する必要があります。新しいバーを定義する機能を探します。その構造のコンセプトが参考になるはずです。
こちらも お読みいただけましたか?
未決済注文を 発注するための最短距離は、どのように知ることができますか?
未決済注文を発注するための最短距離は、どのように知ることができますか?
int level=MarketInfo(Symbol(), MODE_STOPLEVEL)とする。
StopLevelが0であれば、level=MarketInfo(Symbol(), MODE_SPREAD)*2である可能性が高い。
アルパリは間違いなくStopLevelとして見開き2枚を使用しています。
距離の測定はこちらを ご覧ください。
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 関数の 無効なロット数
私の間違いが何なのか教えてください。
ありがとうございます。
私はこの関数を変更し、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つの変数の参照渡しを加えるべきと書きました。
では、最後の「Buy」を例に確認してみましょう。
このように...