double x, y; ---------------------------------------------------------------- 仮に x=MathFloor(OrderLots()/0.02); --------- a. If lots 0.04/0.02=2 --- b. If lots 0.03/0.02=1 y=x*0.02; ---------- a.。2*0,02=0,04 --- б.1*0.02=0.02 if (y==OrderLots())---------- а.0.04==0.04 --- b. 0.02!=0.04 XLots=y; 等しければ、XLotsはyの値を得る
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0, double lt=-1) { double p=0; int i, k=OrdersHistoryTotal().GetProfitFromDateInCurrency();
if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){ if ((OrderSymbol()==sy || sy=="))&& (op<0 || OrderType()==op)){ if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (mn<0 || OrderMagicNumber()==mn) { if (dt<OrderCloseTime()){ if (OrderLots()==lt) { p+=OrderProfit()+OrderCommission()+OrderSwap(); }. } } } } } } return(p); }.
Эта функция возвращает тикет ближайшей к рынку позиции. В качестве критерия "близости" позиции выступает минимум расстояния в пунктах между ценой открытия позиции и текущей рыночной ценой. Отбор учитываемых позиций задаётся внешними параметрами:
sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
ЗЫ. Во вложении скрипт для тестирования функции TicketNearPos().
イゴールさん、こんにちは。
e-OpenByTime EAを変更するか、新しいものを書くか、準備のできたものを提案してもらえませんか :)))
X時に価格からNpipsずつ違う方向にポーズをかけるEAが欲しい!
イゴールさん、こんにちは
シグナルからXピップス、Yピップスで水平線分を 引くスクリプトをお持ちですか?
説明しますと、買い/売りのシグナルがあります(ムーウィングの交差、フラクタルなど)。
スクリプトでは、例えば4つのパラメータを設定します。
- 300 pipsでStop。
- 500pipsをTakeする。
- 10本=バーの長さ。
- シグナルをどこでどのように取るか - シグナル指標の参照、シグナルの条件の挿入...この点は、考えさせられるものがありますね
このスクリプトは、各買いのシグナルで2本の線を描きます。
1) 最初の(「ストップ」)シグナルバーの始値から300ピップス下げる。
2) シグナルバーの始値から500ポイント高くなるように2回目(「テイク」)。
3) ラインはシグナルバーから始まり、10本目のバーで終わります。
Sell信号の場合も同様で、行のインデントが逆になるだけです。
このような可視化は、"信号停止 "の事前予測に役立つと思います。
Vadimさん、こんにちは。
イゴールさん、こんにちは。
質問1.
OpenPosition()関数にエラー138が発生し、ERR_REQUOTEが一時停止してしまいます。
if (err!=135) Sleep(1000*7.7);
ドキュメントではデータをリフレッシュして一気に再挑戦することが推奨されていますが(価格が離れると、なるべく早くポジションを持ちたくなります)))。
それが正しいことでありますように。
if (err!=135 && err!=138) Sleep(1000*7.7);?
それとも、何か見落としているのでしょうか?
質問2.
証券会社(Alpari)が小数点以下5桁を指定している場合、OrderSend()関数で Slippage パラメータを5ポイントに正しく指定する方法を教えてください。
- "50"?
- それとも "5"?
質問1.
OpenPosition()関数で、エラー138 - ERR_REQUOTEが一時停止してしまう。
if (err!=135) Sleep(1000*7.7);
ドキュメントではデータをリフレッシュして一気に再挑戦することが推奨されていますが(価格が離れると、なるべく早くポジションを持ちたくなります)))。
それが正しいことでありますように。
if (err!=135 && err!=138) Sleep(1000*7.7);?
はい、大丈夫です!そんなやり方もあるんですね...。ありがとうございました。
質問2.
私の証券会社(Alpari)が小数点以下5桁を与える場合、OrderSend()関数でSlippage パラメータを5ポイントに正しく設定する方法を教えてください。
-"50"?
- それとも "5 "ですか?
こんにちはイゴール、
あなたの関数GetProfitFromDateInCurrency()を洗練させるのに役立つことができます。クローズドオーダーのみでも利益を計算する必要があります。注文の部分決済(分割)とCloseBy関数を使って、既存の注文の残高を決済するようにしています。注文が 偶数か奇数か判断するために、次の式を使います:
double x, y; ---------------------------------------------------------------- 仮に
x=MathFloor(OrderLots()/0.02); --------- a. If lots 0.04/0.02=2 --- b. If lots 0.03/0.02=1
y=x*0.02; ---------- a.。2*0,02=0,04 --- б.1*0.02=0.02
if (y==OrderLots())---------- а.0.04==0.04 --- b. 0.02!=0.04
XLots=y; 等しければ、XLotsはyの値を得る
これはうまくいきます(偶数/奇数に分ける方法が思いつかず、聞いてもヒントが出ませんでした)。
次に、実際の関数呼び出し(私があなたのものから作ったもの)
ClOrdProf=GetProfitFromDateInCurrency("", -1, -1, XTime, XLots);
そして私の無駄な試みは、あなたの関数に利益がロットが均一でなければ計算できないという条件を追加することです。
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0, double lt=-1)
{
double p=0;
int i, k=OrdersHistoryTotal().GetProfitFromDateInCurrency();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
if ((OrderSymbol()==sy || sy=="))&& (op<0 || OrderType()==op)){
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (dt<OrderCloseTime()){
if (OrderLots()==lt) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}.
}
}
}
}
}
}
return(p);
}.
カウントしたくないのです。
1.関数のどこかが間違っているのでしょうか?
2.OrdCloseByで注文がクローズされることが影響しているのでは?
- すべてのオーダー、0 - 偶数ロット、1 - 奇数ロット、そして
if (OrderLots()==lt) {
p+=OrderProfit() + OrderCommission() + OrderSwap()
}
から
if (lt == -1){
p+=OrderProfit()+OrderCommission()+OrderSwap()です。
} else {
int test = OrderLors() * 100;
if (lt == test % 2) {
p+=OrderProfit()+OrderCommission()+OrderSwap()です。
} else {
p+=OrderProfit()+OrderCommission()+OrderSwap()です。
}
}
例えば、GetProfitFromDateInCurrency() 関数のint lt パラメータ は、 3つのフラグ 値を取るとします。
ありがとうございます、モジュロによるロット計算の方法は正しいですね、後で使ってみます・・・。しかし、ここで面白いことに、私が改良した関数が機能することが判明したのです......ある意味、です。p+=」の変化を見るAlertを追加したところ、すべて正しく計算されるようになりました。しかし、情報を取得しようとする値ClOrdProfは表示されない: Alert ("ClOrdProf= ",ClOrdProf);.コードでは次のようになります。
int start()
{
ブール
ClOrdProf=false;//論理値
ClOrdProf=GetProfitFromDateInCurrency(",-1,-1,XTime,XLots); //ファンクション・コール
if (ClOrdProf==true)
Alert ("ClOrdProf=",ClOrdProf); - ログには更新されません。
return; //start()から抜ける
}
// 注文を決済したときの利益を計算する関数
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0, double lt=-1)
{
double p=0;
int i, 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=="))&& (op<0 || OrderType()==op)){
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {。
if (mn<0 || OrderMagicNumber()==mn) {.
if (dt<OrderCloseTime()){
if (OrderLots()==lt){。
p+=OrderProfit()+OrderCommission()+OrderSwap()です。
Alert ("p= ", p); - ログに更新
}.
}
}
}
}
}
}
return(p)です。
}
何が悪いのかがわからない...。
おかしいでしょ、おかしいでしょ、あなたにも、私にも、おかしいでしょ...(ウラジーミル・セミョノビッチ)。
ClOrdProfは本来boolではなくdoubleです。そして、「if (ClOrdProf>0 || ClOrdProf<0)」があるはずです。「or」で始まる2番目の部分は、利益がマイナスの場合のカウントのためです。
奇数・偶数ロットの計算でお世話になったkeekkenen さんに感謝します。
Igorさん、機能アップの可能性をありがとうございます。
Функция TicketNearPos().
Эта функция возвращает тикет ближайшей к рынку позиции. В качестве критерия "близости" позиции выступает минимум расстояния в пунктах между ценой открытия позиции и текущей рыночной ценой. Отбор учитываемых позиций задаётся внешними параметрами:
- sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
- op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
- mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
ЗЫ. Во вложении скрипт для тестирования функции TicketNearPos().成行価格=未決済注文価格である場合、この注文はこの機能では考慮されなくなります。
この簡単な条件をコードに追加する必要があったのです。
この条件は、類似の関数であるTypeNearPos()やPriceOpenNearPos()でも役に立ちます。