コーディングのヘルプ - ページ 242 1...235236237238239240241242243244245246247248249...786 新しいコメント Mladen Rakic 2014.03.12 11:18 #2411 Mastercash: 以下のコードはalerts.It refuse to work.Plsと2つのEMAクロスオーバーで、何が間違っていたのか、誰かが教えてくれますか?#property copyright "wnk" (プロパティコピー) #プロパティリンク "www.wnk.com" #property indicator_chart_window(インジケーターチャートウィンドウ #property インジケーターバッファー2 #property indicator_color1 ライム #property indicator_color2 レッド //--- バッファ double ExtMapBuffer1[]; double ExtMapBuffer2[]; //外部変数...........................。 //+------------------------------------------------------------------+ //| カスタムインジケータ初期化関数 //+------------------------------------------------------------------+ int init() { //---- インジケータ SetIndexStyle(0,DRAW_ARROW).SetIndexStyleを設定します。 SetIndexArrow(0,217)を設定します. SetIndexBuffer(0,ExtMapBuffer1)を設定します。 SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW)を設定します。 SetIndexArrow(1,217)を設定します。 SetIndexBuffer(1,ExtMapBuffer2)を設定します。 SetIndexEmptyValue(1,0.0); //---- return(0); } //+------------------------------------------------------------------+ //| カスタムインジケータ初期化関数 //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| カスタムインジケーターイテレーション関数 //+------------------------------------------------------------------+ int start() { static datetime LastAlertTime = TimeCurrent(); int counted_bars=IndicatorCounted(), 制限をかける。 if(counted_bars<0) return(-1)とする。 if(counted_bars>0)の場合 counted_bars--; limit=Bars-counted_bars; while(リミット) { double ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0)。 double ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0); double b4ema13=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0); double b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1); double b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1); double b4ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1); double b4ema13=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1); double mom=iMomentum(NULL,0,14,PRICE_CLOSE,0)となります。 double b4mom=iMomentum(NULL,0,14,PRICE_CLOSE,1); double b4mom=iMomentum(NULL,0,14,PRICE_CLOSE,1); //アップアラート if((LastAlertTime!=Time[0])&&(ema5>ema13)&&(ema5>b4ema5)&&(ema13>b4ema13)&&(mom>b4mom)&&(mom>98.6591)) ExtMapBuffer1[limit]=High[limit]+5*Point。 LastAlertTime = Time[0]; アラート(Symbol()," ",Period(), "M Price UP"); //売りアラート if((LastAlertTime!=Time[0])&&(ema5<ema13)&&(ema5<b4ema5)&&(ema13<b4ema13)&&(mom<b4mom)&&(mom<100.6872)) ExtMapBuffer2[limit]=Low[limit]-5*Point。 LastAlertTime = Time[0]; Alert(Symbol()," ",Period(), "M Price Down"); } return(0); } //+------------------------------------------------------------------+ マスターキャッシュ 今すぐ試してみてください ファイル: _test_mc.mq4 3 kb Axel Franzen 2014.03.12 11:30 #2412 mladen: アクセルできるようになります。 単純に、未決済注文をスキャンして、その未決済価格を希望する新しい未決済価格と比較するか、未決済注文が開かれたバーを未決済注文の基準となるバーと比較すればいいのです。 EDIT: 関数を追加するのを忘れていたようです。 i=OrdersTotal()-1 "を変えて20回ほど以下のような関数を書いて、すべての関数で呼び出して新しい始値に対して マッチングさせるのはうまくいくでしょうか? double OpenOrderPrice() { double TempOrderPrice = 0; for(int i=OrdersTotal()-1;i>=0;i--) { if (オーダーセレクト(i,SELECT_BY_TICKET,MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { TempOrderPrice = OrderOpenPrice(); } } return(TempOrderPrice); } Mladen Rakic 2014.03.12 11:48 #2413 BlackCoq: EDIT: 関数を追加するのを忘れていたようです。以下のような関数を、異なる「i=OrdersTotal()-1」に対して20回ほど書き、すべての関数で呼び出し、新しい開始価格と照合することは可能でしょうか? double OpenOrderPrice() { double TempOrderPrice = 0; for(int i=OrdersTotal()-1;i>=0;i--) { if (オーダーセレクト(i,SELECT_BY_TICKET,MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { TempOrderPrice = OrderOpenPrice(); } } return(TempOrderPrice); } こんな感じで試してみてください。 double OpenOrderPrice(double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); break; } } return(TempOrderPrice); } BlackCoq 注文を出すべき価格と、その価格からの最大偏差(絶対値:例えば5ポイントなら5ではなく、5*_ポイント)を渡して、その差がその価格偏差より小さいか等しければ、その近似値で出した注文の価格が返される。そうでない場合は-1が返されます(この場合、似たような価格の注文がないことを意味します)。 MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 Coding help Basic questions ... Axel Franzen 2014.03.12 13:42 #2414 mladen: こんな感じにしてみてください。double OpenOrderPrice(double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); break; } } return(TempOrderPrice); } BlackCoq 注文を出すべき価格と、その価格からの最大偏差(絶対値:例えば5ポイントなら5ではなく、5*_ポイント)を渡して、その差がその偏差より小さいか同じなら、その近似値で出した注文の価格を返します。そうでない場合は、結果として-1を返します(この場合、類似した価格の注文は存在しないことを意味します)。 そこで、買いたい価格から2ピップス乖離した未決済注文があるかどうかを確認するために、次の関数を 呼び出します。 double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (オーダーセレクト(i,SELECT_BY_TICKET,MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation))。 TempOrderPrice = OrderOpenPrice(); priceDeviation = 2*Point; priceToCompareTo = Ask; ブレーク } } return(TempOrderPrice); } そして、ショート用をもう一つ作る? MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 Coding help アスク! Mladen Rakic 2014.03.12 14:12 #2415 BlackCoq: つまり、買いたい値段から2pips乖離した未決済注文があるかどうかを確認したい場合、この関数を呼び出すわけです。double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (オーダーセレクト(i,SELECT_BY_TICKET,MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation))。 TempOrderPrice = OrderOpenPrice(); priceDeviation = 2*Point; priceToCompareTo = Ask; ブレーク } } return(TempOrderPrice); } そして、ショーツ用にもう一枚作る? いいえ このように関数を 呼び出します。 if (OpenOrderPrice(OP_BUY,Ask ,2.0*_Point) == -1) はロングを許可し if (OpenOrderPrice(OP_SELL,Ask,2.0*_Point) == -1) ショートを許可する。 この呼び出しは、注文を出すロジックがあるコード部分から行う必要があります。 しかし、その場合、関数は別のものでなければなりません(このように)。 double OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)) if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); break; } } return(TempOrderPrice); } この関数は両方のケースをカバーしており、関数内のコードを変更するべきではありません。 ___________________ PS: _Point 変数は、metatrader 4 の古いビルドでは存在しません。上の例は、新しいmetatrader4用に書かれています。古いビルド(509以前)をお使いの場合は、"_Point "は "Point "でなければなりません。 MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 Coding help KimIVの便利な機能 Axel Franzen 2014.03.12 17:36 #2416 mladen: いいえこのように関数を呼び出します。 この呼び出しは、注文を出すためのロジックがあるコード部分から行う必要があります。 しかし、その場合、関数は別のものでなければなりません(このように)。 この関数は両方のケースをカバーしているので、関数内のコードを変更する必要はありません。 ___________________ PS: _Point 変数は metatrader 4 の古いビルドには存在しません。上の例は、新しいmetatrader4用に書かれています。古いビルド(509以前)をお使いの場合は、"_Point "は "Point "でなければなりません。 ありがとうございます。その関数をEAにコピーして、書いていただいたように呼び出したのですが、なぜか新値の乖離範囲内に他のポジションがあるにもかかわらず、オープンしてしまいます。その関数は、すべての建値を チェックしているのでしょうか、それとも最新のものだけなのでしょうか? 下のEAも含めて。 //+------------------------------------------------------------------+//| expert start function | //+------------------------------------------------------------------+ int start() { //---- bool result; PipsUntilNextCandle--; DisplayUserFeedback(); if (OldBars != Bars) { PipsUntilNextCandle = RenkoBoxSize; OldBars = Bars; DoesTradeExist(); double take; double stop; RefreshRates(); //Have the last candles risen , 1=last candle , 2 = last two candles if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1)) { if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits); if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits); result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber); if (!result) OldBars = 0; } //if (Open[0] > Open[2]) //Have the last candles fallen , , 1=last candle , 2 = last two candles if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1)) { if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits); if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits); result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber); if (!result) OldBars = 0; }//if (Open[0] > Open[2]) }//if (OldBars != Bars) //---- Coding help [アーカイブ!】どんなエキスパートやインジケーターでも無料で書きます。 [アーカイブ!】どんなルーキーの質問でも、フォーラムを散らかさないように。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 2. Mladen Rakic 2014.03.12 17:57 #2417 BlackCoq: ありがとうございます。その関数をEAにコピーして、書いていただいたように呼び出したのですが、なぜか新値の乖離範囲内に他のポジションがあるにもかかわらず、ポジションをオープンしてしまいます。その関数はすべての建値をチェックしているのでしょうか、それとも最新のものだけなのでしょうか?下のEAも含めて。 //+------------------------------------------------------------------+//| expert start function | //+------------------------------------------------------------------+ int start() { //---- bool result; PipsUntilNextCandle--; DisplayUserFeedback(); if (OldBars != Bars) { PipsUntilNextCandle = RenkoBoxSize; OldBars = Bars; DoesTradeExist(); double take; double stop; RefreshRates(); //Have the last candles risen , 1=last candle , 2 = last two candles if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1)) { if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits); if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits); result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber); if (!result) OldBars = 0; } //if (Open[0] > Open[2]) //Have the last candles fallen , , 1=last candle , 2 = last two candles if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1)) { if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits); if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits); result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber); if (!result) OldBars = 0; }//if (Open[0] > Open[2]) }//if (OldBars != Bars) //---- その関数 コードに間違いがあります。OrderSelect()がポジションで動くと思い込んでいて、確認していなかったのです。こちらをお使いください。 double OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); break; } } return(TempOrderPrice); } これで正常に動作するはずです MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 EAが複数のペアで実行されない、助けが必要 コーディングの方法は? Axel Franzen 2014.03.12 22:03 #2418 mladen: その関数コードに間違いがあります。OrderSelect()がpositionで動くと思い込んでいて、確認をしていませんでした。これを使用してください。double OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); break; } } return(TempOrderPrice); } これで正しく動作するはずです そして、そうなるのです。ムラデンさん、今回も素晴らしい作品をありがとうございました。 SuLaimon 2014.03.13 09:17 #2419 こんにちは、Mladen 。 私は最後の注文を選択し、最後のオープン価格に基づいて 追加の注文を開くしようとしているこのコードを見てください。以下の点を除き、すべて機能しているように見えます。 IfOrderDoesNotExist7(); IfOrderDoesNotExist5(); は互いに干渉しているようです。もし私が以下のように2つのうちの1つをコメントすれば、注文はうまくいくでしょう。 // IfOrderDoesNotExist7()。 IfOrderDoesNotExist5()。 私は間違ってやっている何を教えてもらえますか? ファイル: 564.mq4 10 kb Mladen Rakic 2014.03.13 10:12 #2420 sulaimoney: こんにちは、Mladen 。このコードを見てください。最後の注文を選択し、最後の建値に基づいて追加の注文を出そうとしています。以下の点を除いては、すべてうまくいっているように見えます。 IfOrderDoesNotExist7(); IfOrderDoesNotExist5()です。 は互いに干渉しているようです。もし私が以下のように2つのうちの1つをコメントすれば、注文はうまくいくでしょう。 // IfOrderDoesNotExist7()。 IfOrderDoesNotExist5()です。 私は何が間違っているのか教えてください。 スライムマネー 問題はこの2つの関数ではなく、新しいメタトレーダー4がブーリアン条件をチェックする方法にあったと思います(メタトレーダー4の新しいビルドのいくつかを使用していた場合)。コードを少し簡素化し、ブーリアン条件を厳密に定義する必要があった一箇所を解決しました。試してみてください。 ファイル: 564_1.mq4 10 kb 1...235236237238239240241242243244245246247248249...786 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
以下のコードはalerts.It refuse to work.Plsと2つのEMAクロスオーバーで、何が間違っていたのか、誰かが教えてくれますか?
#property copyright "wnk" (プロパティコピー)
#プロパティリンク "www.wnk.com"
#property indicator_chart_window(インジケーターチャートウィンドウ
#property インジケーターバッファー2
#property indicator_color1 ライム
#property indicator_color2 レッド
//--- バッファ
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//外部変数...........................。
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int init()
{
//---- インジケータ
SetIndexStyle(0,DRAW_ARROW).SetIndexStyleを設定します。
SetIndexArrow(0,217)を設定します.
SetIndexBuffer(0,ExtMapBuffer1)を設定します。
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW)を設定します。
SetIndexArrow(1,217)を設定します。
SetIndexBuffer(1,ExtMapBuffer2)を設定します。
SetIndexEmptyValue(1,0.0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| カスタムインジケーターイテレーション関数
//+------------------------------------------------------------------+
int start()
{
static datetime LastAlertTime = TimeCurrent();
int counted_bars=IndicatorCounted(),
制限をかける。
if(counted_bars<0)
return(-1)とする。
if(counted_bars>0)の場合
counted_bars--;
limit=Bars-counted_bars;
while(リミット)
{
double ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0)。
double ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0); double b4ema13=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
double b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1); double b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1);
double b4ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1); double b4ema13=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);
double mom=iMomentum(NULL,0,14,PRICE_CLOSE,0)となります。
double b4mom=iMomentum(NULL,0,14,PRICE_CLOSE,1); double b4mom=iMomentum(NULL,0,14,PRICE_CLOSE,1);
//アップアラート
if((LastAlertTime!=Time[0])&&(ema5>ema13)&&(ema5>b4ema5)&&(ema13>b4ema13)&&(mom>b4mom)&&(mom>98.6591))
ExtMapBuffer1[limit]=High[limit]+5*Point。
LastAlertTime = Time[0];
アラート(Symbol()," ",Period(), "M Price UP");
//売りアラート
if((LastAlertTime!=Time[0])&&(ema5<ema13)&&(ema5<b4ema5)&&(ema13<b4ema13)&&(mom<b4mom)&&(mom<100.6872))
ExtMapBuffer2[limit]=Low[limit]-5*Point。
LastAlertTime = Time[0];
Alert(Symbol()," ",Period(), "M Price Down");
}
return(0);
}
//+------------------------------------------------------------------+マスターキャッシュ
今すぐ試してみてください
アクセル
できるようになります。
単純に、未決済注文をスキャンして、その未決済価格を希望する新しい未決済価格と比較するか、未決済注文が開かれたバーを未決済注文の基準となるバーと比較すればいいのです。EDIT: 関数を追加するのを忘れていたようです。
i=OrdersTotal()-1 "を変えて20回ほど以下のような関数を書いて、すべての関数で呼び出して新しい始値に対して マッチングさせるのはうまくいくでしょうか?
double OpenOrderPrice()
{
double TempOrderPrice = 0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (オーダーセレクト(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
return(TempOrderPrice);
}
EDIT: 関数を追加するのを忘れていたようです。
以下のような関数を、異なる「i=OrdersTotal()-1」に対して20回ほど書き、すべての関数で呼び出し、新しい開始価格と照合することは可能でしょうか?
double OpenOrderPrice()
{
double TempOrderPrice = 0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (オーダーセレクト(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
return(TempOrderPrice);
}こんな感じで試してみてください。
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
注文を出すべき価格と、その価格からの最大偏差(絶対値:例えば5ポイントなら5ではなく、5*_ポイント)を渡して、その差がその価格偏差より小さいか等しければ、その近似値で出した注文の価格が返される。そうでない場合は-1が返されます(この場合、似たような価格の注文がないことを意味します)。
こんな感じにしてみてください。
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
注文を出すべき価格と、その価格からの最大偏差(絶対値:例えば5ポイントなら5ではなく、5*_ポイント)を渡して、その差がその偏差より小さいか同じなら、その近似値で出した注文の価格を返します。そうでない場合は、結果として-1を返します(この場合、類似した価格の注文は存在しないことを意味します)。そこで、買いたい価格から2ピップス乖離した未決済注文があるかどうかを確認するために、次の関数を 呼び出します。
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (オーダーセレクト(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation))。
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Ask;
ブレーク
}
}
return(TempOrderPrice);
}
そして、ショート用をもう一つ作る?
つまり、買いたい値段から2pips乖離した未決済注文があるかどうかを確認したい場合、この関数を呼び出すわけです。
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (オーダーセレクト(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation))。
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Ask;
ブレーク
}
}
return(TempOrderPrice);
}
そして、ショーツ用にもう一枚作る?いいえ
このように関数を 呼び出します。
if (OpenOrderPrice(OP_BUY,Ask ,2.0*_Point) == -1) はロングを許可し
if (OpenOrderPrice(OP_SELL,Ask,2.0*_Point) == -1) ショートを許可する。
この呼び出しは、注文を出すロジックがあるコード部分から行う必要があります。
しかし、その場合、関数は別のものでなければなりません(このように)。
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
この関数は両方のケースをカバーしており、関数内のコードを変更するべきではありません。
___________________
PS: _Point 変数は、metatrader 4 の古いビルドでは存在しません。上の例は、新しいmetatrader4用に書かれています。古いビルド(509以前)をお使いの場合は、"_Point "は "Point "でなければなりません。
いいえ
このように関数を呼び出します。
この呼び出しは、注文を出すためのロジックがあるコード部分から行う必要があります。
しかし、その場合、関数は別のものでなければなりません(このように)。
この関数は両方のケースをカバーしているので、関数内のコードを変更する必要はありません。
___________________
PS: _Point 変数は metatrader 4 の古いビルドには存在しません。上の例は、新しいmetatrader4用に書かれています。古いビルド(509以前)をお使いの場合は、"_Point "は "Point "でなければなりません。ありがとうございます。その関数をEAにコピーして、書いていただいたように呼び出したのですが、なぜか新値の乖離範囲内に他のポジションがあるにもかかわらず、オープンしてしまいます。その関数は、すべての建値を チェックしているのでしょうか、それとも最新のものだけなのでしょうか?
下のEAも含めて。
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----ありがとうございます。その関数をEAにコピーして、書いていただいたように呼び出したのですが、なぜか新値の乖離範囲内に他のポジションがあるにもかかわらず、ポジションをオープンしてしまいます。その関数はすべての建値をチェックしているのでしょうか、それとも最新のものだけなのでしょうか?
下のEAも含めて。
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----その関数 コードに間違いがあります。OrderSelect()がポジションで動くと思い込んでいて、確認していなかったのです。こちらをお使いください。
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
これで正常に動作するはずです
その関数コードに間違いがあります。OrderSelect()がpositionで動くと思い込んでいて、確認をしていませんでした。これを使用してください。
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
そして、そうなるのです。ムラデンさん、今回も素晴らしい作品をありがとうございました。
こんにちは、Mladen 。
私は最後の注文を選択し、最後のオープン価格に基づいて 追加の注文を開くしようとしているこのコードを見てください。以下の点を除き、すべて機能しているように見えます。
IfOrderDoesNotExist7(); IfOrderDoesNotExist5();
は互いに干渉しているようです。もし私が以下のように2つのうちの1つをコメントすれば、注文はうまくいくでしょう。
// IfOrderDoesNotExist7()。
IfOrderDoesNotExist5()。
私は間違ってやっている何を教えてもらえますか?
こんにちは、Mladen 。
このコードを見てください。最後の注文を選択し、最後の建値に基づいて追加の注文を出そうとしています。以下の点を除いては、すべてうまくいっているように見えます。
IfOrderDoesNotExist7(); IfOrderDoesNotExist5()です。
は互いに干渉しているようです。もし私が以下のように2つのうちの1つをコメントすれば、注文はうまくいくでしょう。
// IfOrderDoesNotExist7()。
IfOrderDoesNotExist5()です。
私は何が間違っているのか教えてください。スライムマネー
問題はこの2つの関数ではなく、新しいメタトレーダー4がブーリアン条件をチェックする方法にあったと思います(メタトレーダー4の新しいビルドのいくつかを使用していた場合)。コードを少し簡素化し、ブーリアン条件を厳密に定義する必要があった一箇所を解決しました。試してみてください。