MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1644 1...163716381639164016411642164316441645164616471648164916501651...1953 新しいコメント Tretyakov Rostyslav 2021.10.03 14:17 #16431 Andrey Sokolov 端末を閉じた とき、またはインジケータを再起動したときのみ表示されます。 フォルダには表示されているのですが、最初の1枚を除く2枚のスクリーンショットがエラー5019(ファイルが存在しない)で動きません(最初の1枚はタイマーで作成したもの)。 テスターではマーケットが閉じており、タイマーが作動していません。 Tretyakov Rostyslav 2021.10.03 14:26 #16432 Andrey Sokolov 端末を閉じた とき、またはインジケータを再起動したときのみ表示されます。 2枚のスクリーンショットが、1枚目を除いて、フォルダに表示されているにもかかわらず、エラー5019(ファイルが存在しない)で移動しません(1枚目のタイマーで作成したものを除く)。 criptaで確認したところ、すべてのスクリーンショットがそうなっていますが、ムーブエラーが発生しています。 2021.10.03 15:23:56.384 Scrin BTCUSD,M5: screen name_file 2021.10.03 15-23-56.png 2021.10.03 15:23:56.367 Scrin BTCUSD,M5: FileMove ERR: 4051 2021.10.03 15:23:56.367 Scrin BTCUSD,M5: OnTimer() 2021.10.03 15:23:51.391 Scrin BTCUSD,M5: screen name_file 2021.10.03 15-23-51.png 2021.10.03 15:23:51.374 Scrin BTCUSD,M5: FileMove ERR: 4051 2021.10.03 15:23:51.374 Scrin BTCUSD,M5: OnTimer() 2021.10.03 15:23:46.378 Scrin BTCUSD,M5: screen name_file 2021.10.03 15-23-46.png 2021.10.03 15:23:46.360 Scrin BTCUSD,M5: FileMove ERR: 4051 2021.10.03 15:23:46.360 Scrin BTCUSD,M5: OnTimer() Tretyakov Rostyslav 2021.10.03 15:09 #16433 MakarFX #:クリプトで全てのスクリーンショットを確認したが、ズレが生じているそういうことなんです。//+------------------------------------------------------------------+ bool Move(){ string src_path=name_file; string dst_path=name_folder+"//"+name_file; ResetLastError(); if(FileMove(src_path,0,dst_path,0)){ Print("FileMove OK "); return true; } else{ string err_text="FileMove ERR: "+(string)GetLastError(); if(GetLastError()==5019) err_text+=(" 5019 name_file "+name_file); Print(err_text); } return false; } そもそも、なぜわざわざ引っ越しをするのか? EVGENII SHELIPOV 2021.10.03 16:12 #16434 MakarFX #:機能を分離して、操作しやすくする。 以下は、OnTick()の例です。ご覧の通り、関数の呼び出ししかありません。 マカーさん、こんにちは、私はコードを作り直し、ジャーナルの平均価格を計算する機能を実装しました、エラーはありませんが、平均価格からのトローリングはありません。 //+----------------------------------------------------------------------------+ //| Расчет среденй цены | //+----------------------------------------------------------------------------+ double GetAveragePrice() { order_lots = 0; price = 0; { for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if (OrderType() == OP_BUY || OrderType() == OP_SELL) { price += OrderOpenPrice() * OrderLots(); order_lots += OrderLots(); avg_price = NormalizeDouble(price / order_lots, Digits); { ObjectDelete(0, "AveragePriceLine"); ObjectCreate(0,"AveragePriceLine" ,OBJ_HLINE, 0, 0, avg_price); ObjectSet("AveragePriceLine",OBJPROP_COLOR, Magenta); } } } } } } return(avg_price); } //+----------------------------------------------------------------------------+ //| Модификация групповых ордеров | //+----------------------------------------------------------------------------+ void ModifyOrders(int otype) { for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if (otype == OP_BUY) tp = NormalizeDouble (GetAveragePrice() + TakeProfitGroupOrder*Point, Digits); if (otype == OP_SELL) tp = NormalizeDouble (GetAveragePrice() - TakeProfitGroupOrder*Point, Digits); if ((otype == OP_BUY || otype == OP_SELL) && (Drawdown > DrawdownClosingTakeprofitZero)) tp = NormalizeDouble (GetAveragePrice(), Digits); } } } for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0)) Print("Ордера успешно модифицированы!"); else Print("Ошибка модификации ордеров!"); TrailingGroupOrder(); } } } } //+----------------------------------------------------------------------------+ //| Трейлинг стоп групповых ордеров | //+----------------------------------------------------------------------------+ void TrailingGroupOrder() { for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderType() == OP_BUY && Bid - GetAveragePrice() > TrailingStopGroupOrder*Point) { if(Bid - GetAveragePrice() > TrailingStopGroupOrder*Point || OrderStopLoss() == 0) { if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder )*Point || OrderStopLoss() == 0) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - TrailingStopGroupOrder*Point, Digits), tp, 0)) Print("Ошибка модификации групповых ордеров на покупку!"); } } } if(OrderType() == OP_SELL && GetAveragePrice() - Ask > TrailingStopGroupOrder*Point) { if(GetAveragePrice() - Ask > TrailingStopGroupOrder*Point || OrderStopLoss() == 0) { if(OrderStopLoss() > Ask + (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStopGroupOrder*Point, Digits), tp, 0)) Print("Ошибка модификации групповых ордеров на продажу!"); } } } } } } 私は、失敗なく動作する単一注文のためのこの関数からネッティングの原理を取りました。 //+----------------------------------------------------------------------------+ //| Трейлинг стоп одиночных ордеров | //+----------------------------------------------------------------------------+ void Trailing() { for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if(OrderType() == OP_BUY && Bid - OrderOpenPrice() > TrailingStopFirstOrder*Point) { if(Bid - OrderOpenPrice() > TrailingStopFirstOrder*Point || OrderStopLoss() == 0) { if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopFirstOrder)*Point || OrderStopLoss() == 0) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - TrailingStopFirstOrder*Point, Digits), tp, 0)) Print("Ошибка модификации ордера на покупку!"); } } } if(OrderType() == OP_SELL && OrderOpenPrice() - Ask > TrailingStopFirstOrder*Point) { if(OrderOpenPrice() - Ask > TrailingStopFirstOrder*Point || OrderStopLoss() == 0) { if(OrderStopLoss() > Ask + (TrailingStep + TrailingStopFirstOrder)*Point || OrderStopLoss() == 0) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStopFirstOrder*Point, Digits), tp, 0)) Print("Ошибка модификации ордера на продажу!"); } } } } } } } Tretyakov Rostyslav 2021.10.03 16:39 #16435 EVGENII SHELIPOV #:Makarさん、こんにちは。平均価格を計算するコードを再設計しましたが、平均価格のトローリングがログに表示されません。私は、完璧に動作する単一注文のためのこの関数からトレール設定の原則を取りました。その仕組みはこうだ...。//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(CountTrade()>1) TrailingGroupOrder(); } //+----------------------------------------------------------------------------+ //| Расчет среденй цены | //+----------------------------------------------------------------------------+ double GetAveragePrice() { order_lots = 0; price = 0; { for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if (OrderType() == OP_BUY || OrderType() == OP_SELL) { price += OrderOpenPrice() * OrderLots(); order_lots += OrderLots(); avg_price = NormalizeDouble(price / order_lots, Digits); ObjectDelete(0, "AveragePriceLine"); ObjectCreate(0,"AveragePriceLine" ,OBJ_HLINE, 0, 0, avg_price); ObjectSet("AveragePriceLine",OBJPROP_COLOR, Magenta); } } } } } return(avg_price); } //+----------------------------------------------------------------------------+ //| Трейлинг стоп групповых ордеров | //+----------------------------------------------------------------------------+ void TrailingGroupOrder() { for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderType() == OP_BUY) { if(Bid - GetAveragePrice() > TrailingStopGroupOrder*Point || OrderStopLoss() == 0) { if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder )*Point || OrderStopLoss() == 0) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - TrailingStopGroupOrder*Point, Digits), tp, 0)) Print("Ошибка модификации групповых ордеров на покупку!"); } } } if(OrderType() == OP_SELL) { if(GetAveragePrice() - Ask > TrailingStopGroupOrder*Point || OrderStopLoss() == 0) { if(OrderStopLoss() > Ask + (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStopGroupOrder*Point, Digits), tp, 0)) Print("Ошибка модификации групповых ордеров на продажу!"); } } } } } } //+----------------------------------------------------------------------------+ //| Модификация групповых ордеров | //+----------------------------------------------------------------------------+ void ModifyOrders(int otype) { for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if (otype == OP_BUY) { tp = NormalizeDouble (GetAveragePrice() + TakeProfitGroupOrder*Point, Digits); if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0)) Print("Ордера успешно модифицированы!"); else Print("Ошибка модификации ордеров!"); } if (otype == OP_SELL) { tp = NormalizeDouble (GetAveragePrice() - TakeProfitGroupOrder*Point, Digits); if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0)) Print("Ордера успешно модифицированы!"); else Print("Ошибка модификации ордеров!"); } } } } } 不要な機能を削除しました。 Andrei Sokolov 2021.10.03 16:43 #16436 MakarFX #:だから、うまくいっているんです。 本当に使えるの?私は、このオプションでは、まだすべての問題があります。しかも、mt5です。 Andrei Sokolov 2021.10.03 16:44 #16437 MakarFX #: なぜ、引っ越しで大騒ぎをするのか? ソートする Tretyakov Rostyslav 2021.10.03 16:48 #16438 Andrey Sokolov #:ソート用 ソートもあるが、余分な機能はない #property strict #property indicator_chart_window #property indicator_plots 0 enum ENUM_FULL_MANUAL { full, //весь график manual, //указанный }; input int timer=5; //время на шаг в секундах input ENUM_FULL_MANUAL skr_mode=full; //размер скриншота input int width = 640; // ширина input int height = 320;// высота input string format = ".png"; ENUM_ALIGN_MODE align_mode=ALIGN_RIGHT; // тип выравнивания string name_folder, name_file; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { EventSetTimer(timer); Print("OnInit()"); name_folder=Symbol()+" "+StringPeriod(); ScreenShot(); return(INIT_SUCCEEDED); } //=================================================================== void OnDeinit(const int reason) { EventKillTimer(); } //+------------------------------------------------------------------+ //| 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[]) { //--- //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { Print("OnTimer() "); ScreenShot(); } //+------------------------------------------------------------------+ bool ScreenShot(){ name_file=TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+format; StringReplace(name_file, ":", "-"); if(skr_mode==full){ if(ChartScreenShot(0, name_folder+"//"+name_file, (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS, 0) , (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0), ALIGN_RIGHT)){ Print("screen name_file ", name_file); return true; } else{ Print("screen ERR: ", GetLastError()); } } if(skr_mode==manual){ if(ChartScreenShot(0, name_file, width, height, align_mode)){ return true; } } return false; } string StringPeriod(){ if(Period()==1) return "M1"; if(Period()==2) return "M2"; if(Period()==3) return "M3"; if(Period()==4) return "M4"; if(Period()==5) return "M5"; if(Period()==6) return "M6"; if(Period()==10) return "M10"; if(Period()==12) return "M12"; if(Period()==15) return "M15"; if(Period()==20) return "M20"; if(Period()==30) return "M30"; if(Period()==16385) return "H1"; if(Period()==16386) return "H2"; if(Period()==16387) return "H3"; if(Period()==16388) return "H4"; if(Period()==16390) return "H6"; if(Period()==16392) return "H8"; if(Period()==16396) return "H12"; if(Period()==16408) return "Daily"; if(Period()==32769) return "Weekly"; if(Period()==49153) return "Monthly"; return "ERROR"; } Tretyakov Rostyslav 2021.10.03 16:51 #16439 Andrey Sokolov #:本当に使えるの?私は、このオプションでは、まだすべての問題があります。しかも、mt5です。すみません、4人分書いてしまいました...。5でチェックイン!すべてがうまくいく。2021.10.03 17:55:54.192 Scrin (BTCUSD,M5) OnTimer() 2021.10.03 17:55:54.195 Scrin (BTCUSD,M5) screen name_file 2021.10.03 17-55-54.png 2021.10.03 17:55:59.211 Scrin (BTCUSD,M5) OnTimer() 2021.10.03 17:55:59.213 Scrin (BTCUSD,M5) screen name_file 2021.10.03 17-55-59.png 2021.10.03 17:56:04.214 Scrin (BTCUSD,M5) OnTimer() 2021.10.03 17:56:04.217 Scrin (BTCUSD,M5) screen name_file 2021.10.03 17-56-04.png 2021.10.03 17:56:09.204 Scrin (BTCUSD,M5) OnTimer() 2021.10.03 17:56:09.236 Scrin (BTCUSD,M5) screen name_file 2021.10.03 17-56-09.png 2021.10.03 17:56:14.202 Scrin (BTCUSD,M5) OnTimer() 2021.10.03 17:56:14.205 Scrin (BTCUSD,M5) screen name_file 2021.10.03 17-56-14.png ファイル: Scrin.mq5 8 kb EVGENII SHELIPOV 2021.10.03 17:03 #16440 MakarFX #:こんな感じです... 機能を微調整した - 不要なものを削除した Makarさん、コードのどこで関数を参照しているのか、明確にしていただけますか? //+----------------------------------------------------------------------------+ //| Модификация групповых ордеров | //+----------------------------------------------------------------------------+ void ModifyOrders(int otype) { for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if (otype == OP_BUY) tp = NormalizeDouble (GetAveragePrice() + TakeProfitGroupOrder*Point, Digits); if (otype == OP_SELL) tp = NormalizeDouble (GetAveragePrice() - TakeProfitGroupOrder*Point, Digits); if ((otype == OP_BUY || otype == OP_SELL) && (Drawdown > DrawdownClosingTakeprofitZero)) tp = NormalizeDouble (GetAveragePrice(), Digits); } } } for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0)) Print("Ордера успешно модифицированы!"); else Print("Ошибка модификации ордеров!"); TrailingGroupOrder(); } } } } 1...163716381639164016411642164316441645164616471648164916501651...1953 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
フォルダには表示されているのですが、最初の1枚を除く2枚のスクリーンショットがエラー5019(ファイルが存在しない)で動きません(最初の1枚はタイマーで作成したもの)。
2枚のスクリーンショットが、1枚目を除いて、フォルダに表示されているにもかかわらず、エラー5019(ファイルが存在しない)で移動しません(1枚目のタイマーで作成したものを除く)。
criptaで確認したところ、すべてのスクリーンショットがそうなっていますが、ムーブエラーが発生しています。
クリプトで全てのスクリーンショットを確認したが、ズレが生じている
そういうことなんです。
そもそも、なぜわざわざ引っ越しをするのか?機能を分離して、操作しやすくする。
以下は、OnTick()の例です。
ご覧の通り、関数の呼び出ししかありません。
マカーさん、こんにちは、私はコードを作り直し、ジャーナルの平均価格を計算する機能を実装しました、エラーはありませんが、平均価格からのトローリングはありません。
私は、失敗なく動作する単一注文のためのこの関数からネッティングの原理を取りました。
Makarさん、こんにちは。平均価格を計算するコードを再設計しましたが、平均価格のトローリングがログに表示されません。
私は、完璧に動作する単一注文のためのこの関数からトレール設定の原則を取りました。
その仕組みはこうだ...。
不要な機能を削除しました。だから、うまくいっているんです。
本当に使えるの?私は、このオプションでは、まだすべての問題があります。しかも、mt5です。
なぜ、引っ越しで大騒ぎをするのか?
ソートする
ソート用
ソートもあるが、余分な機能はない
本当に使えるの?私は、このオプションでは、まだすべての問題があります。しかも、mt5です。
すみません、4人分書いてしまいました...。
5でチェックイン!すべてがうまくいく。
こんな感じです...
機能を微調整した - 不要なものを削除したMakarさん、コードのどこで関数を参照しているのか、明確にしていただけますか?