コーディングのヘルプ - ページ 242

 
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
 
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);

}

 
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が返されます(この場合、似たような価格の注文がないことを意味します)。

 
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);

}

そして、ショート用をもう一つ作る?

 
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 "でなければなりません。

 
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)

//----
 
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);

}

これで正常に動作するはずです

 
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);

}

これで正しく動作するはずです

そして、そうなるのです。ムラデンさん、今回も素晴らしい作品をありがとうございました。

 

こんにちは、Mladen 。

私は最後の注文を選択し、最後のオープン価格に基づいて 追加の注文を開くしようとしているこのコードを見てください。以下の点を除き、すべて機能しているように見えます。

IfOrderDoesNotExist7(); IfOrderDoesNotExist5();

は互いに干渉しているようです。もし私が以下のように2つのうちの1つをコメントすれば、注文はうまくいくでしょう。

// IfOrderDoesNotExist7()。

IfOrderDoesNotExist5()。

私は間違ってやっている何を教えてもらえますか?

ファイル:
564.mq4  10 kb
 
sulaimoney:
こんにちは、Mladen 。

このコードを見てください。最後の注文を選択し、最後の建値に基づいて追加の注文を出そうとしています。以下の点を除いては、すべてうまくいっているように見えます。

IfOrderDoesNotExist7(); IfOrderDoesNotExist5()です。

は互いに干渉しているようです。もし私が以下のように2つのうちの1つをコメントすれば、注文はうまくいくでしょう。

// IfOrderDoesNotExist7()。

IfOrderDoesNotExist5()です。

私は何が間違っているのか教えてください。

スライムマネー

問題はこの2つの関数ではなく、新しいメタトレーダー4がブーリアン条件をチェックする方法にあったと思います(メタトレーダー4の新しいビルドのいくつかを使用していた場合)。コードを少し簡素化し、ブーリアン条件を厳密に定義する必要があった一箇所を解決しました。試してみてください。

ファイル:
564_1.mq4  10 kb