エラー、バグ、質問 - ページ 3143 1...313631373138313931403141314231433144314531463147314831493150...3185 新しいコメント Alexey Viktorov 2022.01.30 20:24 #31421 Wizard #: こんにちは!このコードにはPositionSelectByTicketという行が必要でしょうか?その場合、PositionGetTicket(i)を使うか、PositionGetInteger(POSITION_TICKET)のままで、その中に正しくチケットを書き込むにはどうしたらよいでしょうか。ありがとうございました。 失礼ですが、ドキュメントには明記されていないのでしょうか? この関数は、オープンポジションのリストのインデックスでポジションチケットを返し、さらにそのポジションで作業するためにこのポジションを自動的に選択 します ポジションが既に選択されている場合、PositionSelectByTicket機能で再選択する理由 削除済み 2022.01.30 20:52 #31422 Alexey Viktorov #:失礼な言い方ですが、ドキュメントに明記されていないのですか?ポジションが既に選択されている場合、PositionSelectByTicket機能で再選択する理由 ご返信ありがとうございましたというのも、<Trade/Trade.mqh>ライブラリを見ると、PositionClose(const ulong ticket,const ulong deviation) 関数も PositionSelectByTicket を使っているからです。また、PositionClose(const ulong ticket,const ulong deviation) 関数自体は、ループ for(int i = PositionsTotal()-1; i >= 0; i--) と組み合わせてコーダーがよく使うものである。で、すべてのポジションをループしています。そして、どこかで余分なものを使っていないかと考えています。 Roman 2022.01.30 20:57 #31423 Wizard #: PositionSelectByTicketの行は、コードに必要ですか?その場合、PositionGetTicket(i)やPositionGetInteger(POSITION_TICKET)のままで、どのようにチケットを中に書き込むのが正しいでしょうか。ありがとうございました。 int IsPositions() { int pos = 0; int total = PositionsTotal(); for(int i = total-1; i >= 0; i--) { if(!PositionGetTicket(i)) continue; if(PositionGetString(POSITION_SYMBOL) == Symbol_T && PositionGetInteger(POSITION_MAGIC) == EXPERT_MAGIC) pos = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) ? 1 : (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) ? -1 : 0; } return(pos); } 削除済み 2022.01.30 21:06 #31424 Roman #: ありがとうございました。そのため、PositionGetTicket(i)で十分であり、PositionSelectByTicketは必要 ない。 Alexey Viktorov 2022.01.31 06:03 #31425 Wizard #: ご回答ありがとうございましたというのも、<Trade/Trade.mqh> ライブラリを見ると、PositionClose(const ulong ticket,const ulong deviation) 関数も PositionSelectByTicket を使っているからです。また、PositionClose(const ulong ticket,const ulong deviation) 関数自体は、ループ for(int i = PositionsTotal()-1; i >= 0; i--) と組み合わせてコーダーがよく使うものである。で、すべてのポジションをループしています。そして、どこかで余分なものを使っていないかと考えています。 ライブラリのPositionClose(const ulong ticket,const ulong deviation)関数は、クローズするポジションのチケットを受け取るが、どのようにチケットを受け取ったか、そのポジションが存在するかは誰も知らない。 そのため、PositionSelectByTicketは、閉じるべきものがあるかどうかを主にチェックします。また、すべてのポジションがループで閉じていることが多いと判断したのはなぜですか?必ずしもそうではありませんが...。 削除済み 2022.01.31 14:49 #31426 Alexey Viktorov #:ライブラリのPositionClose(const ulong ticket,const ulong deviation)関数は、クローズするポジションのチケットを受け取るが、どのようにチケットを受け取ったか、そのポジションが存在するかは誰にもわからない。したがって、PositionSelectByTicketは、閉じるべきものがあるかどうかを主にチェックする。また、すべてのポジションがループで閉じていることが多いと判断したのはなぜですか?必ずしもそうではありませんが...。 はい、これで全部わかりました。私は最近あるEAを作りました。あるフォーラムにあったあなたの例(平均値付き)に従って、Timur Mashninのコードと組み合わせて書きました。今はそこの条件を変えて、ライブラリを使わず、すべてシステム関数に置き換えて少し書き直すことにしました。単純なPositionSelectでは、1つの位置と1つの選択肢という非常にシンプルなものでしたが、このループでは、もちろん、より多くの考慮とロジックが必要です。 Mikhail Rudyk 2022.01.31 14:54 #31427 こんにちは お願いします をコードで入力してください。 テスターのインジケーターが正常に動作するようにした チャートに表示すると、正しく表示されない なぜ間違っているのかがわからない。 //+------------------------------------------------------------------+ //| Oscil.mq5 | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 5 #property indicator_plots 5 #property indicator_color1 clrNONE #property indicator_color2 clrRoyalBlue #property indicator_color3 clrPink #property indicator_color4 clrAqua #property indicator_color5 clrYellow #property indicator_width1 1 #property indicator_width2 5 #property indicator_width3 5 #property indicator_width4 5 #property indicator_width5 5 double MainLine[]; double UpLine[]; double DnLine[]; double muls[]; double x,y,z; double price; double mulSum=0; double Pi = 3.1415926535; bool LastUp = false; bool GoUp = false; input bool otl = false; /***********Range***************/ int Length = 3; int MajorRangeStrength = 4; double MajorRangeBuy[]; double MajorRangeSell[]; double RangePrice = 0.0, SweepB = 0.0; int Switch2 = 0, SwitchB = 0; double Price2BuyA = 0.0; int Price2BuyB = 1.0; double Price2SellA = 0.0; int Price2SellB = 0.0; bool BuySwitchB = false, SellSwitchB = false; int hendlMA_1; double MA_1[]; int hendlMA_2; double MA_2[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,MainLine,INDICATOR_DATA); PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0); PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); ArraySetAsSeries(MainLine, true); SetIndexBuffer(1,UpLine,INDICATOR_DATA); PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0); PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); ArraySetAsSeries(UpLine, true); SetIndexBuffer(2,DnLine,INDICATOR_DATA); PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0); PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); ArraySetAsSeries(DnLine, true); SetIndexBuffer(3,MajorRangeBuy,INDICATOR_DATA); PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0); PlotIndexSetInteger(3,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); ArraySetAsSeries(MajorRangeBuy, true); SetIndexBuffer(4,MajorRangeSell,INDICATOR_DATA); PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0); PlotIndexSetInteger(4,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); ArraySetAsSeries(MajorRangeSell, true); hendlMA_1=iMA(Symbol(),0,1,0,MODE_LWMA,PRICE_CLOSE); ArraySetAsSeries(MA_1,true); hendlMA_2=iMA(Symbol(),0,1,0,MODE_SMMA,PRICE_CLOSE); ArraySetAsSeries(MA_2,true); ArrayResize(muls, 99); mulSum = 0; for (int i0 = 0; i0 < 98; i0++) {//повторяем в цикле 98 раз if (i0 <= 18) y = 1.0 * i0 / 18; //если это первые 18 повторений else y = (i0 - 18) * 7.0 / 79.0 + 1.0; //иначе x = MathCos(Pi * y); z = 1.0 / (3.0 * Pi * y + 1.0); if (y <= 0.5) z = 1; muls[i0] = z * x; mulSum += muls[i0]; } if(otl)Print(" Распределение создано muls[20]=",muls[20]); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- if (PeriodSeconds() <60*60 || PeriodSeconds() >10080*60) return(0); int depth=0; int l_ind_counted_8 = prev_calculated; //Возвращает количество баров, не измененных после последнего вызова индикатора. int bars=Bars(Symbol(),PERIOD_CURRENT); if (l_ind_counted_8 < 0) return (0); if (l_ind_counted_8 == 0) { depth = bars - 98; for(int a=0;a<bars;a++) { MainLine[a] = 0; UpLine[a] = 0; DnLine[a] = 0; MajorRangeBuy[a]=0; MajorRangeSell[a]=0; } } if (l_ind_counted_8 > 0) depth = bars - l_ind_counted_8; if(otl)Print(" количество баров, не измененных после последнего вызова индикатора= ",l_ind_counted_8," Количество баров на текущем графике Bars=",bars," depth= ",depth); if (l_ind_counted_8 < 1) { for (int i2 = 1; i2 < 100; i2++) { MainLine[bars - i2] = 0; UpLine[bars - i2] = 0; DnLine[bars - i2] = 0; } } for (int i1 = depth; i1 >= 0; i1--) { price = 0; CopyBuffer(hendlMA_1,0,0,bars,MA_1); for (int i2 = 0; i2 <= 98; i2++) { if(i2 + i1>=bars)break; price += muls[i2] * MA_1[i2 + i1]; } if (mulSum > 0.0) MainLine[i1] = price / mulSum; GoUp=MainLine[i1 + 1] > MainLine[i1] ; if (GoUp) { if (!LastUp) DnLine[i1+1] = MainLine[i1+1]; DnLine[i1] = MainLine[i1]; UpLine[i1] = 0; } else { if (LastUp) UpLine[i1+1] = MainLine[i1+1]; UpLine[i1] = MainLine[i1]; DnLine[i1] = 0; } LastUp=GoUp; }// for (int i1 // return (0); /***************** Range **********************/ int counted_bars=prev_calculated; if(otl)Print(" Range counted_bars = ", counted_bars); if(counted_bars<0) return(-1); int position=bars-counted_bars; if (position<0) position=0; if (position==0) position=1; int rnglength = 250; double range = 0.0, srange = 0.0; if(otl) Print(" position=",position); for (int pos = position; pos >=0; pos--) {/***************** MAIN Range **********************/ srange = 0.0; int j = 0; for (int i=0;i<rnglength;i++) { j++; int posr = pos + i; if (posr >= bars) break; srange = srange + (High(posr) - Low(posr)); } range = srange / j * Length; int BarNumber = bars-pos; //?????????? if (BarNumber < 0) BarNumber = 0; CopyBuffer(hendlMA_2,0,0,bars,MA_2); //Print(bars," - ",pos); if(pos<bars)RangePrice = MA_2[pos]; //Moving Average MODE_SMMA else RangePrice = MA_2[pos-1]; if (BarNumber == 1) { SweepB = range * MajorRangeStrength; Price2BuyA = RangePrice; Price2SellA = RangePrice; } if (BarNumber > 1) { if (Switch2 > - 1)//проверка цикла на покупку { if (RangePrice < Price2BuyA) //если средняя цена ниже { if (BuySwitchB ) MajorRangeBuy [pos +BarNumber - Price2BuyB] = 0; //OUT Price2BuyA = RangePrice; Price2BuyB = BarNumber; BuySwitchB = true; } else if (RangePrice > Price2BuyA) { SwitchB = BarNumber - Price2BuyB; MajorRangeBuy [pos +SwitchB] = MainLine[pos + SwitchB]*1.0005; //OUT BuySwitchB = true; if (RangePrice - MA_2[pos + SwitchB] >= SweepB && SwitchB >= 1) { Switch2 = - 1; Price2SellA = RangePrice; Price2SellB = BarNumber; SellSwitchB = false; BuySwitchB = false; } } } if (Switch2 < 1)//проверка цикла на продажу { if (RangePrice > Price2SellA ) { if (pos +BarNumber - Price2SellB<bars&&SellSwitchB ) MajorRangeSell [pos +BarNumber - Price2SellB] = 0; //OUT Price2SellA = RangePrice; Price2SellB = BarNumber; SellSwitchB = true; } else if (RangePrice < Price2SellA) { SwitchB = BarNumber - Price2SellB ; if(pos+ SwitchB<bars)MajorRangeSell[pos + SwitchB] =MainLine[pos + SwitchB]*1.0005; //OUT SellSwitchB = true; if (pos + SwitchB<bars&&MA_2[pos + SwitchB] - RangePrice >= SweepB && SwitchB >= 1) { Switch2 = 1; Price2BuyA = RangePrice; Price2BuyB = BarNumber; SellSwitchB = false; BuySwitchB = false; } } } } // MajorRangeSell[pos] = 0; // MajorRangeBuy[pos] = 0; } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //======================================================================================== double High(int index) { if(index < 0) return(-1); double Arr[]; ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT; if(CopyHigh(Symbol(),timeframe, index, 1, Arr)>0) return(Arr[0]); else return(-1); } //======================================================================================== double Low(int index) { if(index < 0) return(-1); double Arr[]; ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT; if(CopyLow(Symbol(),timeframe, index, 1, Arr)>0) return(Arr[0]); else return(-1); } Alexey Viktorov 2022.02.01 07:32 #31428 MqlTradeCheckResult構造体には何が返されるのですか? 必要な 取引操作に必要な証拠 金の額」と資料に 記載されています。 フィールド 商品説明 リトラクタブルコード リターンコード バランス 取引実行後になる残高値 エクイティ 取引成立後の持分 価値 利潤 取引実行後に発生するフローティングプロフィットの値 マージン 必要な取引操作に必要な証拠金の額 マージンフリー 必要な取引を実行した後に残る資本の額 マージンレベル 必要な取引の実行後に設定する証拠金のレベル コメント レスポンスコードへのコメント、エラーの説明 しかし、実際に得られるのは、現在のマージンと、操作実行後に取られるマージンを加えた合計の大きさである。 以下はそのスクリプトです。 #include <Trade\Trade.mqh> CTrade trade; MqlTradeRequest my_request; MqlTradeCheckResult my_check_result; MqlTick mqlTick; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { SymbolInfoTick(_Symbol, mqlTick); CheckOrder(0.01, ORDER_TYPE_SELL); Print(my_check_result.margin); //--- trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, 0.01, mqlTick.bid, 0.0, 0.0); //--- CheckOrder(0.01, ORDER_TYPE_SELL); Print(my_check_result.margin); }/******************************************************************/ /********************************************************************\ || \********************************************************************/ bool CheckOrder(double volume, ENUM_ORDER_TYPE order_type) { if(order_type != ORDER_TYPE_BUY && order_type != ORDER_TYPE_SELL) return false; ZeroMemory(my_request); ZeroMemory(my_check_result); bool checkOrder = false; //--- setting my_request my_request.action = TRADE_ACTION_DEAL; my_request.symbol = _Symbol; my_request.volume = volume; my_request.type = order_type; my_request.price = order_type == ORDER_TYPE_BUY ? mqlTick.ask : mqlTick.bid; checkOrder = ::OrderCheck(my_request, my_check_result); if(my_check_result.retcode != 0) return(false); //--- return(true); }/******************************************************************/ と実行結果 2022.02.01 10:11:28.002 Test bag (EURUSD,H1) 2.25 2022.02.01 10:11:28.108 Test bag (EURUSD,H1) 4.5 口座にオープンポジションがない場合、my_check_result.marginはロット0.01のオープンポジションのマージンに等しく、口座にすでに0.01がある場合はロット0.02のマージンになります。 ファイル: Test_bag.mq5 5 kb fxsaber 2022.02.01 08:21 #31429 Alexey Viktorov #:しかし、実際に得られるのは、現在のマージンと、この手術が行われた後に取られるマージンの合計の大きさである。 そうですね。 MarginOpen = CheckResult.margin - ::AccountInfoDouble(ACCOUNT_MARGIN); // Маржа для открытия. Alexey Viktorov 2022.02.01 08:34 #31430 fxsaber #:そうですね。 そうであってほしいが、それならドキュメントでも同じであるべきだ。 balansが取引後になる残高の値 である場合 なら、マージン - であるべきです。取引実行後の証拠金。 1...313631373138313931403141314231433144314531463147314831493150...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
こんにちは!このコードにはPositionSelectByTicketという行が必要でしょうか?その場合、PositionGetTicket(i)を使うか、PositionGetInteger(POSITION_TICKET)のままで、その中に正しくチケットを書き込むにはどうしたらよいでしょうか。ありがとうございました。
失礼ですが、ドキュメントには明記されていないのでしょうか?
ポジションが既に選択されている場合、PositionSelectByTicket機能で再選択する理由
失礼な言い方ですが、ドキュメントに明記されていないのですか?
ポジションが既に選択されている場合、PositionSelectByTicket機能で再選択する理由
PositionSelectByTicketの行は、コードに必要ですか?その場合、PositionGetTicket(i)やPositionGetInteger(POSITION_TICKET)のままで、どのようにチケットを中に書き込むのが正しいでしょうか。ありがとうございました。
ご回答ありがとうございましたというのも、<Trade/Trade.mqh> ライブラリを見ると、PositionClose(const ulong ticket,const ulong deviation) 関数も PositionSelectByTicket を使っているからです。また、PositionClose(const ulong ticket,const ulong deviation) 関数自体は、ループ for(int i = PositionsTotal()-1; i >= 0; i--) と組み合わせてコーダーがよく使うものである。で、すべてのポジションをループしています。そして、どこかで余分なものを使っていないかと考えています。
ライブラリのPositionClose(const ulong ticket,const ulong deviation)関数は、クローズするポジションのチケットを受け取るが、どのようにチケットを受け取ったか、そのポジションが存在するかは誰も知らない。
そのため、PositionSelectByTicketは、閉じるべきものがあるかどうかを主にチェックします。また、すべてのポジションがループで閉じていることが多いと判断したのはなぜですか?必ずしもそうではありませんが...。
ライブラリのPositionClose(const ulong ticket,const ulong deviation)関数は、クローズするポジションのチケットを受け取るが、どのようにチケットを受け取ったか、そのポジションが存在するかは誰にもわからない。
したがって、PositionSelectByTicketは、閉じるべきものがあるかどうかを主にチェックする。また、すべてのポジションがループで閉じていることが多いと判断したのはなぜですか?必ずしもそうではありませんが...。
こんにちは
お願いします
をコードで入力してください。
テスターのインジケーターが正常に動作するようにした
チャートに表示すると、正しく表示されない
なぜ間違っているのかがわからない。
MqlTradeCheckResult構造体には何が返されるのですか?
必要な 取引操作に必要な証拠 金の額」と資料に 記載されています。
フィールド
商品説明
リトラクタブルコード
リターンコード
バランス
取引実行後になる残高値
エクイティ
取引成立後の持分 価値
利潤
取引実行後に発生するフローティングプロフィットの値
マージン
必要な取引操作に必要な証拠金の額
マージンフリー
必要な取引を実行した後に残る資本の額
マージンレベル
必要な取引の実行後に設定する証拠金のレベル
コメント
レスポンスコードへのコメント、エラーの説明
しかし、実際に得られるのは、現在のマージンと、操作実行後に取られるマージンを加えた合計の大きさである。
以下はそのスクリプトです。
と実行結果
口座にオープンポジションがない場合、my_check_result.marginはロット0.01のオープンポジションのマージンに等しく、口座にすでに0.01がある場合はロット0.02のマージンになります。
しかし、実際に得られるのは、現在のマージンと、この手術が行われた後に取られるマージンの合計の大きさである。
そうですね。
そうですね。
そうであってほしいが、それならドキュメントでも同じであるべきだ。
balansが取引後になる残高の値 である場合
なら、マージン - であるべきです。取引実行後の証拠金。