初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1324 1...131713181319132013211322132313241325132613271328132913301331...1503 新しいコメント SanAlex 2021.07.01 10:30 #13231 Alexey Viktorov:昨日、この奇跡を見ようと思ってダウンロードしたのですが・・・突然、インターネットが使えなくなりました。雷雨の後、一日中テクニカルワークがあった。そこで、暇つぶしにMQL5で書き直して、ここに 公開することにしました。どんな雲にも銀の裏地があるということですね......。 私はあなたのExpert Advisorに指標を追加しました - 私はあなたが気にしないと思います!私はそれがSprutが 望んでいたようにうまくいったと思う185 (黄色は私がここで 既存のExpert Advisorに追加したものです)。 //+------------------------------------------------------------------+ //| 2 DVA_Martin.mq5 | //| © 2021, Alexey Viktorov | //| https://www.mql5.com/ru/users/alexeyvik/news | //+------------------------------------------------------------------+ #property copyright "© 2021, Alexey Viktorov" #property link "https://www.mql5.com/ru/users/alexeyvik/news" #property version "2.00" //--- #include <Trade\Trade.mqh> CTrade trade; //--- input int TakeProfit1 = 300; // профит первой позиции input int TakeProfit2 = 250; // профит второй позиции input int TakeProfit3 = 200; // профит третьей позиции input int TakeProfit4 = 100; // профит четвертой и следующих позиций input int Step = 200; // шаг первой позиции input int Delta = 100; // добавка к шагу // со второй позиции увеличивает расстояние последующих позиций на величину "дельта" от предыдущего input double Lot = 0.03; // первый лот открытия input double MaximalLot = 0.5; // максимальный лот, который мы разрешаем input int MaxTrades = 9; // максимальное количество позиций одного направления input double MultiplicatorLot = 1.6; // умножаем последующие позиции input int Magic = 123; // идентификатор советника //--- Пременные для хранения собранной информации double MaxLot = 0; double LotBuy = 0; double LotSell = 0; //--- int m_bar_current=0; int StepMA_NRTR_Handle; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- trade.SetExpertMagicNumber(Magic); MaxLot = contractSize(MaximalLot); //--- create StepMA_NRTR indicator StepMA_NRTR_Handle=iCustom(NULL,0,"StepMA_NRTR"); if(StepMA_NRTR_Handle==INVALID_HANDLE) { printf("Error creating StepMA_NRTR indicator"); return(false); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Comment(""); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- double StepMA_NRTR[],StepMA_NRTRS[]; ArraySetAsSeries(StepMA_NRTR,true); ArraySetAsSeries(StepMA_NRTRS,true); int start_pos=1,count=3; if(!iGetArray(StepMA_NRTR_Handle,0,start_pos,count,StepMA_NRTR)|| !iGetArray(StepMA_NRTR_Handle,1,start_pos,count,StepMA_NRTRS)) { return; } //--- int posTotal = PositionsTotal(); double BuyMinPrice = DBL_MAX, // Минимальная цена Buy позиции SelMaxPrice = DBL_MIN, // Максимальная цена Sell позиции BuyMinLot = 0, // Лот самой нижней Buy позиции SelMaxLot = 0, // Лое самой верхней Sell позиции posPrice = 0.0, posLot = 0.0, BuyAwerage = 0, SelAwerage = 0, BuyPrice = 0, SelPrice = 0, BuyLot = 0, SelLot = 0; MqlTick tick; if(!SymbolInfoTick(_Symbol, tick)) return; int b = 0, s = 0; for(int i = 0; i < posTotal; i++) { ulong posTicket = PositionGetTicket(i); if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == Magic) { posPrice = PositionGetDouble(POSITION_PRICE_OPEN); posLot = PositionGetDouble(POSITION_VOLUME); if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { b++; // Считаем открытые позиции на покупку if(posPrice < BuyMinPrice) { BuyMinPrice = posPrice; BuyMinLot = posLot; BuyPrice += posPrice*posLot; // добавить к переменной BuyPrice Цена оредра 1 * лот ордера 1 BuyLot += posLot; // суммируем лоты } } if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { s++; // Считаем открытые позиции на продажу if(posPrice > SelMaxPrice) { SelMaxPrice = posPrice; SelMaxLot = posLot; SelPrice += posPrice*posLot; // добавить к переменной BuyPrice Цена оредра 1 * лот ордера 1 SelLot += posLot; // суммируем лоты } } } } LotBuy = b == 0 ? contractSize(Lot) : fmin(MaxLot, contractSize(BuyMinLot*MultiplicatorLot)); LotSell = s == 0 ? contractSize(Lot) : fmin(MaxLot, contractSize(SelMaxLot*MultiplicatorLot)); //--- //--- BUY Signal if(StepMA_NRTR[m_bar_current]<StepMA_NRTRS[m_bar_current]) { if(b == 0 || (b < MaxTrades && BuyMinPrice-tick.ask >= (Step+Delta*b)*_Point)) openPos(ORDER_TYPE_BUY, LotBuy, tick.ask); } //--- SELL Signal if(StepMA_NRTR[m_bar_current]>StepMA_NRTRS[m_bar_current]) { if(s == 0 || (s < MaxTrades && tick.bid-SelMaxPrice >= (Step+Delta*s)*_Point)) openPos(ORDER_TYPE_SELL, LotSell, tick.bid); } //--- посчитаем математические формулы средних цен switch(b) { case 0 : return; case 1 : BuyAwerage = BuyPrice/BuyLot+TakeProfit1*_Point; break; case 2 : BuyAwerage = BuyPrice/BuyLot+TakeProfit1*_Point; break; case 3 : BuyAwerage = BuyPrice/BuyLot+TakeProfit3*_Point; break; default: BuyAwerage = BuyPrice/BuyLot+TakeProfit4*_Point; break; } switch(s) { case 0 : return; case 1 : SelAwerage = SelPrice/SelLot-TakeProfit1*_Point; break; case 2 : SelAwerage = SelPrice/SelLot-TakeProfit2*_Point; break; case 3 : SelAwerage = SelPrice/SelLot-TakeProfit3*_Point; break; default: SelAwerage = SelPrice/SelLot-TakeProfit4*_Point; break; } normalizePrice(BuyAwerage); // Произведем расчет цены TP Buy normalizePrice(SelAwerage); // Произведем расчет цены TP Sell //--- for(int i = 0; i < posTotal; i++) { ulong posTicket = PositionGetTicket(i); if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == Magic) { double posTP = PositionGetDouble(POSITION_TP); if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { if(fabs(posTP-BuyAwerage) > _Point && tick.ask < BuyAwerage) // Если тейк не равен требуемой цене if(!trade.PositionModify(posTicket, 0.0, BuyAwerage)) Print("Ошибка ", __LINE__); } if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { if(fabs(posTP-SelAwerage) > _Point && tick.bid > SelAwerage) // Если тейк не равен требуемой цене if(!trade.PositionModify(posTicket, 0.0, SelAwerage)) Print("Ошибка ", __LINE__); } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void openPos(ENUM_ORDER_TYPE type, double lot, double price) { trade.CheckVolume(_Symbol, lot, price, type); if(trade.CheckResultMarginFree() <= 0.0) { Print("Not enough money for ", EnumToString(type), " ", lot, " ", _Symbol, " Error code=", trade.CheckResultRetcode()); return; } if(!trade.PositionOpen(_Symbol, type, LotBuy, price, 0.0, 0.0)) Print(trade.ResultRetcode()); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double contractSize(double volume, string symbol = NULL) { symbol = symbol == NULL ? _Symbol : symbol; double v = volume; double volumeStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP); v = round(volume/volumeStep)*volumeStep; double minLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN); return((v < minLot ? minLot : v)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double normalizePrice(double &price, string symbol = NULL) { symbol = symbol == NULL ? _Symbol : symbol; double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE); price = round(price/tickSize)*tickSize; return(tickSize); } //+------------------------------------------------------------------+ //| Filling the indicator buffers from the indicator | //+------------------------------------------------------------------+ bool iGetArray(const int handle,const int buffer,const int start_pos, const int count,double &arr_buffer[]) { bool result=true; if(!ArrayIsDynamic(arr_buffer)) { return(false); } ArrayFree(arr_buffer); //--- reset error code ResetLastError(); //--- fill a part of the iBands array with values from the indicator buffer int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer); if(copied!=count) { return(false); } return(result); } //+------------------------------------------------------------------+ Советники: DVA_Martin 2021.06.30www.mql5.com Статьи и техническая библиотека по автоматическому трейдингу: Советники: DVA_Martin Alexey Viktorov 2021.07.01 10:58 #13232 SanAlex:Expert AdvisorにIndicatorを追加したのですが、気にならないでしょうか?Sprutの 希望通り185に なったと思います。(黄色は私がここで 既存のExpert Advisorに追加したものです)。 また、なぜ3本のバーからの指標値なのでしょうか?また、なぜ配列を時系列に反転させるのでしょうか? 一般的には、合っていないような気がするのですが・・・。 マーティンではダメなんです。 SanAlex 2021.07.01 11:04 #13233 Alexey Viktorov:なぜ3本のバーのインジケータ値が必要なのですか?また、なぜ配列を時系列に反転させるのでしょうか?一般的にはそうではないようですが...マーチンは効きません。 このインジケータは単なる方向フィルタであり、Expert Advisorがすべてのタスクを実行します。 \\\\\\\\\\\\\ インジケーター自体がポジションを開く ことはありません。 Alexey Viktorov 2021.07.01 11:08 #13234 SanAlex:このインジケータは単に方向性フィルタであり、エキスパートが全ての作業を行います。 書かれたコードは、そのタスクを実行する必要があります。しかし、そのような条件を設定したために、マーチンの電源は絶対に入りません。そう思うのだが、確認する気も時間もない。 SanAlex 2021.07.01 11:10 #13235 Alexey Viktorov:そのタスクは、あなたが書いたコードによって実行されなければなりません。でも、マーチンは絶対に電源が入らないという条件にしていますね。そう思うのですが、確認する気も時間もありません。 ここでは、その動作を確認しています。すべて意図したとおりに動作しています。 Sprut 185 2021.07.01 12:09 #13236 Alexey Viktorov:マーチンはインジケーター信号が逆の時のみ作動させるべきか、それとも関係ないのか?例:指標に従って買いポジションを建てた場合。価格が設定された距離だけ下落し、インジケータはすでに売りを示しています。買いポジションを建てるべきでしょうか? 約束通り、何かフォトショップで加工してみました。 もし、はっきりしないのであれば、直接会って話をしないと、私の考えの意味を説明できない。 SanAlex 2021.07.01 15:49 #13237 SanAlex:10万ルーブルから200万ルーブルになったのは、何か悪いことをしたのだろうか。 インディケーターと5minユーロバックを15日間で100万枚に変更した。 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Expert Advisor に追加 - 利益を閉じる (すべてのペアから) と Expert Advisor を削除します。 input group "---- : Parameters: ----" input int TargetProfit = 1000000; // : Balance + Profit(add to balance) //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick(void) { //--- if(AccountInfoDouble(ACCOUNT_EQUITY)>=TargetProfit) { AllClose(); ExpertRemove(); } //--- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 以下の2つのインジケータが必要です (インジケータ名は 変更しないでください)。 ファイル: LeManTrend_Indicator.mq5 17 kb LeMan_BrainTrend1Sig.mq5 18 kb 6_Sprut_185.mq5 36 kb Vitaly Muzichenko 2021.07.01 19:30 #13238 SanAlex:Indicatorと5min Eurobucksを15日間で100万個にスワップした。 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\Expert Advisorに追加 - 合計利益(すべてのペアから)とExpert Advisorを削除することによって利益を閉じるには。\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\この2つのインジケータが存在する必要があります(つまり、 インジケータ名は 変更されません)。 ストップロスの設定が十分でない Aleksei Skrypnev 2021.07.01 20:29 #13239 文字列を分割する方法として、「 \n 」のような方法があります。 文字列変数を1つの文字列に分割する方法はありますか? つまり、この文字列変数で利用可能なすべてのテキスト、値、パラメータなどを1つの文字列に書き込むことである。 csvへの書き込み時に問題が発生しました(文字列変数の値が文字列の束に書き込まれます)。 SanAlex 2021.07.02 03:26 #13240 Vitaly Muzichenko:ストップロスの設定が十分でない ストップロスで同じ利益ではなくなる \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Expert Advisor をもっと頻繁に再起動すればいいと思います。例えば、その週の(すべてのペアの)合計利益を取って、すべてのペアから Expert Advisor を削除しました。 をクリックし、すべてのペアから新しい総利益までEAを再起動します。 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ストップに関するもう一つのアイデア - ポジションを閉じるのではなく、多くの反対側の(負けた)オープンポジションを開くために停止します。 以下は、ロットの オープンポジションの説明です。 int total=PositionsTotal(); for(int i=total-1; i>=0; i--) // returns the number of open positions { string position_GetSymbol=PositionGetSymbol(i); // GetSymbol позиции if(position_GetSymbol==m_symbol.Name()) { if(m_position.PositionType()==POSITION_TYPE_BUY) { PROFIT_BUY=PROFIT_BUY+PositionGetDouble(POSITION_PROFIT); PROFIT_BUY_Lot=PROFIT_BUY_Lot+PositionGetDouble(POSITION_VOLUME); } else { PROFIT_SELL=PROFIT_SELL+PositionGetDouble(POSITION_PROFIT); PROFIT_SELL_Lot=PROFIT_SELL_Lot+PositionGetDouble(POSITION_VOLUME); } { PROFIT_CLOSE=AccountInfoDouble(ACCOUNT_PROFIT); } } } //--- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 理由は、ストップがポジションを閉じないことと、反対ロットが手動取引に役立つはずだからです。 1...131713181319132013211322132313241325132613271328132913301331...1503 新しいコメント 理由: キャンセル 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
昨日、この奇跡を見ようと思ってダウンロードしたのですが・・・突然、インターネットが使えなくなりました。雷雨の後、一日中テクニカルワークがあった。そこで、暇つぶしにMQL5で書き直して、ここに 公開することにしました。
どんな雲にも銀の裏地があるということですね......。
私はあなたのExpert Advisorに指標を追加しました - 私はあなたが気にしないと思います!私はそれがSprutが 望んでいたようにうまくいったと思う185
(黄色は私がここで 既存のExpert Advisorに追加したものです)。
Expert AdvisorにIndicatorを追加したのですが、気にならないでしょうか?Sprutの 希望通り185に なったと思います。
(黄色は私がここで 既存のExpert Advisorに追加したものです)。
また、なぜ3本のバーからの指標値なのでしょうか?また、なぜ配列を時系列に反転させるのでしょうか?
一般的には、合っていないような気がするのですが・・・。 マーティンではダメなんです。
なぜ3本のバーのインジケータ値が必要なのですか?また、なぜ配列を時系列に反転させるのでしょうか?
一般的にはそうではないようですが...マーチンは効きません。
このインジケータは単なる方向フィルタであり、Expert Advisorがすべてのタスクを実行します。
\\\\\\\\\\\\\
インジケーター自体がポジションを開く ことはありません。
このインジケータは単に方向性フィルタであり、エキスパートが全ての作業を行います。
書かれたコードは、そのタスクを実行する必要があります。しかし、そのような条件を設定したために、マーチンの電源は絶対に入りません。そう思うのだが、確認する気も時間もない。
そのタスクは、あなたが書いたコードによって実行されなければなりません。でも、マーチンは絶対に電源が入らないという条件にしていますね。そう思うのですが、確認する気も時間もありません。
ここでは、その動作を確認しています。すべて意図したとおりに動作しています。
マーチンはインジケーター信号が逆の時のみ作動させるべきか、それとも関係ないのか?
例:指標に従って買いポジションを建てた場合。価格が設定された距離だけ下落し、インジケータはすでに売りを示しています。買いポジションを建てるべきでしょうか?
約束通り、何かフォトショップで加工してみました。
もし、はっきりしないのであれば、直接会って話をしないと、私の考えの意味を説明できない。
10万ルーブルから200万ルーブルになったのは、何か悪いことをしたのだろうか。
インディケーターと5minユーロバックを15日間で100万枚に変更した。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Expert Advisor に追加 - 利益を閉じる (すべてのペアから) と Expert Advisor を削除します。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
以下の2つのインジケータが必要です (インジケータ名は 変更しないでください)。
Indicatorと5min Eurobucksを15日間で100万個にスワップした。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Expert Advisorに追加 - 合計利益(すべてのペアから)とExpert Advisorを削除することによって利益を閉じるには。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
この2つのインジケータが存在する必要があります(つまり、 インジケータ名は 変更されません)。
ストップロスの設定が十分でない
文字列を分割する方法として、「 \n 」のような方法があります。
文字列変数を1つの文字列に分割する方法はありますか?
つまり、この文字列変数で利用可能なすべてのテキスト、値、パラメータなどを1つの文字列に書き込むことである。
csvへの書き込み時に問題が発生しました(文字列変数の値が文字列の束に書き込まれます)。
ストップロスの設定が十分でない
ストップロスで同じ利益ではなくなる
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Expert Advisor をもっと頻繁に再起動すればいいと思います。例えば、その週の(すべてのペアの)合計利益を取って、すべてのペアから Expert Advisor を削除しました。
をクリックし、すべてのペアから新しい総利益までEAを再起動します。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ストップに関するもう一つのアイデア - ポジションを閉じるのではなく、多くの反対側の(負けた)オープンポジションを開くために停止します。
以下は、ロットの オープンポジションの説明です。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
理由は、ストップがポジションを閉じないことと、反対ロットが手動取引に役立つはずだからです。