MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 538 1...531532533534535536537538539540541542543544545...1953 新しいコメント Ivan Katsko 2018.04.24 10:24 #5371 Ihor Herasko: このスワップ計算方法をロールオーバーと呼びます。MT4ではプログラム的に知ることができません。深夜にワーキングマーケットオーダーを変更した後、間接的にのみ。MT4には、このような小さな、しかし、かなり不愉快な問題がたくさんあるのです。MT5では少し減りましたが、まだ存在します。 スワップ値(pips)です。成行注文の数量に基づき、預かり通貨 に換算する必要があります。そうすれば、本当のスワップサイズを知ることができます。"MT4でプログラム的に調べる方法はない"。- お忙しい中、ご返信ありがとうございました。 Denis Danilov 2018.04.25 07:16 #5372 こんにちは!フォーラムユーザーの皆様、アルゴリズムを理解するのにお役立てください。目的は、指定された期間内の価格帯を決定し、最大値と最小値に買いと売りのストップを設定することです。ストップロスは逆の注文に設定され、TakeProfit は StopLoss*2 と等しくなければなりません。 そして、ストップロスで 決済されるたびに、決済された注文と同じストップロスとテイクプロフィットで注文が 復元され、1つの注文がテイクプロフィットで決済されると、すべてのサイクルが完了します。そして、すべて最初から範囲を決めて行くのです。 しかし、今はTPを置かないだけというか、建値に置いてストップロスがレンジサイズにない、つまり逆指値注文にないのです。事前にお礼を申し上げておきます。 static int prevtime = 0; int MagicNumber = 12345678; input int stoploss = 40; input int takeprofit = 50; input int padding = 5; int a=1; input string startTime = "14:35"; input string endTime = "18:35"; int expertBars; double max, min; bool isEndTime = true; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //sendOrders(); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ #include <expert.mq4> int start() { //Возвращает максимум и минимум за промежуток if(isTime()) getMaxMin(); // всё, что задается ниже - будет работать по "ценам открытия" //нового бара, т.е. будет срабатывать в момент его появления //на том графике, на кот. стоит советник CheckEvents( MagicNumber ); if ( eventBuyClosed_SL > 0 ) { Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по СтопЛоссу!" ); double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); Alert("Минимальный стоп левел: ", minstoplevel); OrderSend(_Symbol,OP_BUYSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrGreen); } if ( eventBuyClosed_TP > 0 ) { Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по ТейкПрофиту!" ); deleteAllPaddingOrders(); } if ( eventSellClosed_SL > 0 ) { Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по СтопЛоссу!" ); double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); Alert("Минимальный стоп левел: ", minstoplevel); OrderSend(_Symbol,OP_SELLSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrRed); } if ( eventSellClosed_TP > 0 ) { Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по ТейкПрофиту!" ); deleteAllPaddingOrders(); } if ( eventBuyLimitOpened > 0 || eventBuyStopOpened > 0 || eventSellLimitOpened > 0 || eventSellStopOpened > 0 ) Alert( _Symbol, OrderType(), ": сработал отложенный ордер!" ); return(0); } //-----------------------------------------------------------------+ void deleteAllPaddingOrders() { int total = OrdersTotal(); for(int i=total-1;i>=0;i--) { OrderSelect(i, SELECT_BY_POS); int type = OrderType(); if (OrderMagicNumber() != MagicNumber) continue; if (OrderSymbol() != _Symbol) continue; bool result = false; switch(type) { //Close opened long positions case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ); break; //Close opened short positions case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); // break; //Close pending orders //case OP_BUYLIMIT : //case OP_SELLLIMIT : case OP_BUYSTOP : case OP_SELLSTOP : result = OrderDelete( OrderTicket() ); } if(result == false) { Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() ); Sleep(3000); } return; } return; } void sendOrders(bool isFirst) { //--- получим минимальное значение Stop level double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); Print("Minimum Stop Level=",minstoplevel," points"); //--- BUYSTOP //--- вычисленные значения цен SL и TP должны быть нормализованы //--- размещаем рыночный ордер на покупку 1 лота int ticketBuyStop, ticketSellStop; if(!isFirst) { ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,Ask + padding * Point,20,Bid -padding*Point,Ask + padding * Point,"My order",MagicNumber,0,clrGreen); ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,Bid - padding * Point,20,Ask + padding*Point,Bid - padding * Point,"My order",MagicNumber,0,clrRed); } else { ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,max + padding * Point,20,min -padding*Point,max + (max - min + padding) * Point,"My order",MagicNumber,0,clrGreen); ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,min - padding * Point,20,max + padding*Point,min - (max - min + padding)*Point,"My order",MagicNumber,0,clrRed); } if(ticketBuyStop<0) { Print("OrderSend завершилась с ошибкой #",GetLastError()); deleteAllPaddingOrders(); if(a <=5) { //sendOrders(isFirst); a= a+1; } } else Print("Функция OrderSend успешно выполнена"); //---BUYSTOP //---SELLSTOP //--- вычисленные значения цен SL и TP должны быть нормализованы //--- размещаем рыночный ордер на покупку 1 лота if(ticketSellStop<0) { deleteAllPaddingOrders(); if(a <= 5) { //sendOrders(); a= a+1; Print("a", a); } Print("OrderSend завершилась с ошибкой #",GetLastError()); } else Print("Функция OrderSend успешно выполнена"); //---SELLSTOP return; } bool getMaxMin() { int startIndex = iBarShift(_Symbol, 0, StrToTime(startTime), true); min=iLow(NULL,0,iLowest(NULL,0,MODE_LOW,startIndex,0)); max=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,startIndex,0)); Alert("Min: ", min); Alert("Max: ", max); sendOrders(true); return true; } //===============================================================================+ //======| возвращает true если временной диапозон кончился | //===============================================================================+ bool isTime() { if (TimeHour(StrToTime(startTime)) == Hour() && TimeMinute(StrToTime(startTime)) == Minute() && isEndTime) { Alert("Start Timeline"); isEndTime = false; deleteAllPaddingOrders();}; if(TimeHour(StrToTime(endTime)) == Hour() && TimeMinute(StrToTime(endTime)) <= Minute() && !isEndTime) { Alert("End Timeline"); isEndTime = true; return true;}; return false; } //=====================================================================+ //======| возвращает true если появился новый бар, иначе false | //=====================================================================+ //bool isNewBar() //{ //bool res=false; //if(expertBars!=iBars(Symbol(),0)) //{ //expertBars=iBars( Symbol (),0); //res=true; //} //return(res); //} Ihor Herasko 2018.04.25 12:36 #5373 Sobbaka:異なるスレッドで 質問を重複させる必要はありません。 YanSay 2018.04.25 18:02 #5374 こんにちは。 ログでテストすると、OrderSend エラー130が発生します。私が正しく理解していれば、ストップまたはストロークにのみ関連することができます。 #define MagicNumber1 100 //Buy input double MaximumRisk=0.03; //Max риск в сделке input double K=1; //Коэффициент риск к прибыли input int OrderPoint=30; //Расстояние до отложенного ордера double Price=0; //Цена для установки отложенного ордера double SL=0; //Stop Loss double TP=0; //Take Profit double Lots=0; //Просчет лотности исходя из max риска одной сделки void OnTick() { //Параметры для открытия ордера Price = NormalizeDouble(High[1]+OrderPoint*Point,Digits); //Цена открытия ордера SL = NormalizeDouble(Low[1]-Point,Digits); //Стоп лосс if ((Price-SL)<NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits)) {SL=Price-NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);} TP = NormalizeDouble((Price-SL)*K+Price,Digits); //Тэйк профит //Просчет лотности исходя из риска в сделке Lots = NormalizeDouble(((AccountBalance()*MaximumRisk/100.0)/((Price-SL)*1000.0)),1); //Установка отложенного ордера bool send1=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price,3,SL,TP,"comment",MagicNumber1,0,clrGreen); } Ihor Herasko 2018.04.25 19:44 #5375 YanSay:こんにちは。 ログでテストするとき、OrderSend error 130というエラーがあります - 私が正しく理解しているなら、それはストップまたはストロークにのみ関連することができます。 保留中の注文の 建値も影響を受けます。そのため、現在の市場価格と注文の建値の距離を確認する必要があるのです。この場合価格 - お問い合わせください。 YanSay 2018.04.25 20:12 #5376 Ihor Herasko: 保留中の注文の 始値も適用されます。したがって、現在の市場価格と注文の開始価格との間の距離も確認する必要があります。この場合価格 - お問い合わせください。 ありがとうございました。 PolarSeaman 2018.04.25 22:03 #5377 Artyom Trishkin: Hour()関数は何を返すのですか?現在の時間を返します。これは、現在の時間が11より大きく、17より小さい場合、私の仕事のやり方です。 if(Hour()>=17&&Hour()<=11)continue; が、どうやって? PolarSeaman 2018.04.25 22:09 #5378 Tigerfreerun:私にはちょっと複雑なんです。コードのどの部分に追加するのか、mnとmag_nの意味を教えてください。 あなたの体調が悪くなる前に if(Hour()>=0&&Hour()<=8&&!OP_TO(mag_n))step = 5; else step =10;mag_n - ここでEAのIGをどこに置けばいいのでしょうか? Vitaly Muzichenko 2018.04.25 22:12 #5379 PolarSeaman:私が書いているのは、現在の時間が11以上17未満である場合、どのようにすべきかということです。インジケーターについての質問と理解しています。Hour() -> time[i]の代わりに PolarSeaman 2018.04.25 22:16 #5380 Vitaly Muzichenko:インジケーターについての質問だと理解しています。Hour() -> time[i]の代わりに。はい、それは助かりました、今度は時間を制限したいです。17時から23時までのカウントを除く。 for(int i=limit-2; i>0; i--) { if(Hour()>=17&&Hour()<=11)continue; if(i%2==0) { if(open[i]<close[i] && open[i+1]>close[i+1]) { k1++; // if(k1>max) {max=k1; dat_max=time[i];} if(k1>=4)Print("Num: ",k1,"dat_max ",time[i]); SetText("Obj_"+(string)time[i],(string)k1,time[i],high[i],Arr); } else k1=0; } else { if(open[i]<close[i] && open[i+1]>close[i+1]) { k2++; //if(k2>max){ max=k2; dat_max=time[i];} if(k2>=4)Print("Num: ",k2,"dat_max ",time[i]); SetText("Obj_"+(string)time[i],(string)k2,time[i],high[i],Arr); } else k2=0; } } 1...531532533534535536537538539540541542543544545...1953 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
このスワップ計算方法をロールオーバーと呼びます。MT4ではプログラム的に知ることができません。深夜にワーキングマーケットオーダーを変更した後、間接的にのみ。MT4には、このような小さな、しかし、かなり不愉快な問題がたくさんあるのです。MT5では少し減りましたが、まだ存在します。
スワップ値(pips)です。成行注文の数量に基づき、預かり通貨 に換算する必要があります。そうすれば、本当のスワップサイズを知ることができます。
"MT4でプログラム的に調べる方法はない"。- お忙しい中、ご返信ありがとうございました。
こんにちは!フォーラムユーザーの皆様、アルゴリズムを理解するのにお役立てください。目的は、指定された期間内の価格帯を決定し、最大値と最小値に買いと売りのストップを設定することです。ストップロスは逆の注文に設定され、TakeProfit は StopLoss*2 と等しくなければなりません。
そして、ストップロスで 決済されるたびに、決済された注文と同じストップロスとテイクプロフィットで注文が 復元され、1つの注文がテイクプロフィットで決済されると、すべてのサイクルが完了します。そして、すべて最初から範囲を決めて行くのです。
しかし、今はTPを置かないだけというか、建値に置いてストップロスがレンジサイズにない、つまり逆指値注文にないのです。事前にお礼を申し上げておきます。
異なるスレッドで 質問を重複させる必要はありません。
こんにちは。
ログでテストすると、OrderSend エラー130が発生します。私が正しく理解していれば、ストップまたはストロークにのみ関連することができます。
こんにちは。
ログでテストするとき、OrderSend error 130というエラーがあります - 私が正しく理解しているなら、それはストップまたはストロークにのみ関連することができます。
保留中の注文の 建値も影響を受けます。そのため、現在の市場価格と注文の建値の距離を確認する必要があるのです。この場合価格 - お問い合わせください。
保留中の注文の 始値も適用されます。したがって、現在の市場価格と注文の開始価格との間の距離も確認する必要があります。この場合価格 - お問い合わせください。
Hour()関数は何を返すのですか?
現在の時間を返します。これは、現在の時間が11より大きく、17より小さい場合、私の仕事のやり方です。
が、どうやって?
私にはちょっと複雑なんです。コードのどの部分に追加するのか、mnとmag_nの意味を教えてください。
あなたの体調が悪くなる前に
mag_n - ここでEAのIGをどこに置けばいいのでしょうか?
私が書いているのは、現在の時間が11以上17未満である場合、どのようにすべきかということです。
インジケーターについての質問と理解しています。Hour() -> time[i]の代わりに
インジケーターについての質問だと理解しています。Hour() -> time[i]の代わりに。
はい、それは助かりました、今度は時間を制限したいです。17時から23時までのカウントを除く。