//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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;
}
}
あれやこれやと、他の関数への不必要な呼び出しが多く、その結果エラーが発生するのです。
まあ、すでに失敗しているわけですが......。
シンプルでわかりやすい。自分の好きなように編集できる。
これに 似たものを描けるかどうか...。
更新
ExistOPNearPrice()関数をテストするためのスクリプトを添付しています。
作ってみたが、正しいかどうかわからない。
まあ、すでに失敗しているわけですが...。
シンプルでわかりやすいのは、自分に合った調整をすることです。
やった、正しいかどうかわからないけど。
CorrectingPrice()。
CorrectingPrice()。
イゴール、証券会社によっては、値がゼロのStopLevelの代わりにSpread*2を使っているところもあるんだ。コードをざっと見たところ、このような状況に対するチェックはありませんでした。この状況を確認するために、コードを微調整するのがいいと思います。そうしないと、同じ130のエラーが発生します。
アルテム そんなDCは初めてだ...。個人的なメッセージで2、3個送ってもらえますか?貿易規則を読むと・・・。
それとも、もっとシンプルな方法があるのでしょうか?そのような補正をするほど正しいのか、教えてください。
UPDATE:CorrectingPrice() 関数を修正しました。
CorrectTF()関数の新バージョンです。
以前、私はCorrectTF() 関数について、その名前と機能が一致しないと批判されたことがあります。実際には、最も近い最小値まで時間枠を調整するのであって、最も近いものだけを調整するのではありません。標準時間軸間の算術平均値を計算し、その説明に従って関数を書き換えています。
アルテム そんなDCは初めてだ...。個人的なメッセージで2、3個送ってもらえますか?取引規制を読んでみる・・・。
落下
あるいは、もっとシンプルなものでもよいでしょう。そのような補正をするほど正しいのか、教えてください。
もちろん、すべて正しいです。
UPDATE:CorrectingPrice() 関数を修正しました。
アルチョム そういう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() を必要としないのでしょうか?
よろしくお願いします。