MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1654 1...164716481649165016511652165316541655165616571658165916601661...1953 新しいコメント Volodymyr Zubov 2021.10.08 19:29 #16531 MakarFX #:他の選択肢をご存知でしたら、お書きください。人を助けることができる) すべての変数をiniteで別々に作り、さらに処理で分ける(手抜きをする必要はない)。 次に、ブロックを括り、戻り値の変数を比較します。 Tretyakov Rostyslav 2021.10.08 19:37 #16532 Volodymyr Zubov #:initですべての変数を別々に作り、さらに処理で分ける (手抜きの必要はない)。次に、ブロックを括り、戻り値の変数を比較します。 方法を示す。 Volodymyr Zubov 2021.10.08 19:50 #16533 こんなところにも...。 フクロウ全体を掲載したかったのですが、フォーラムが許可してくれないのです。 どのフラグメントが必要ですか? Tretyakov Rostyslav 2021.10.08 19:53 #16534 Volodymyr Zubov #:こんなところにも...。どの作品が欲しいですか? チャロ... Volodymyr Zubov 2021.10.08 20:01 #16535 知っている) Igor Makanu 2021.10.08 20:25 #16536 トレーディング、自動売買システム、ストラテジーテストに関するフォーラム MQL4、MQL5の初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 マカーFX さん 2021.10.08 18:43 //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(CheckForOpen()==0) { if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue)) Print("BUY OK"); } if(CheckForOpen()==1) { if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red)) Print("SELL OK"); } } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ int CheckForOpen() // Открытие ордера по методу Пуриа { double malw,mas1,mas2,macd; int res=-1, buy=0, sell=0; // Считывание параметров индикаторов 3 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 2 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 1 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 0 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} if(buy ==4) res=0; if(sell==4) res=1; return(res); } 私はあなたが関数で同一の指標の呼び出しをラップする必要があったと思います、コードはよりコンパクトになり、誰が知っている、今、あなたは4つのバーの指標の値を使用して、明日は5のために.... 即ち int SignalByPuria(const int bar) { malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,bar); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,bar); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,bar); ...... } 時々、特定のバーでトレードシグナルを持たないインジケータがあります。 私は通常、enum E_CMD{CMD_BUY,CMD_SELL,CMD_NONE}を使用します。 で、「シグナル」関数のシグネチャはE_CMD SignalByPuria(const int bar) となり、EAコード自体は以下のようなものになります。 E_CMD Signal_ind_1(const int bar) { .... } E_CMD Signal_ind_2(const int bar) { .... } E_CMD Signal_ind_2(const int bar) { .... } void OnTick() { ..... if(Signal_ind_1 = =CMD_BUY && Signal_ind_2 == CMD_BUY && Signal_ind_3 == CMD_BUY) // открываем ордер на покупку else if(Signal_ind_1 = =CMD_SELL && Signal_ind_2 == CMD_SELL && Signal_ind_3 == CMD_SELL) // открываем ордер на продажу .... } この方法によって、すでに書かれているEAコードに新しい売買シグナルを素早く追加することができます。 Tretyakov Rostyslav 2021.10.08 20:41 #16537 Igor Makanu #: 同じインジケータの呼び出しを関数にまとめると、コードがよりコンパクトになり、また、今は4本のバーでインジケータ値を使用し、明日は5本で...といったことが可能になると思います。即ち時々、特定のバーでトレードシグナルを持たないインジケータがあります。 私は通常、enum E_CMD{CMD_BUY,CMD_SELL,CMD_NONE}を使用します。で、「シグナル」関数のシグネチャはE_CMD SignalByPuria(const int bar) となり、EAコード自体は以下のようなものになります。この方法によって、すでに書かれているEAコードに新しい売買シグナルを素早く追加することができます。 イゴールさんありがとうございます、参考にさせていただきます) Volodymyr Zubov 2021.10.08 21:48 #16538 話を戻して、MT 4のマーケットポジションオープン 機能は以下の通りです。 //+------------------------------------------------------------------+ //| Zero_Level.mq4 | //| Copyright © 2007, Xupypr | //+------------------------------------------------------------------+ // Функция вычисляющая уровни безубытка, на покупку, на продажу с учетом накопленных свопов. double Zero_Level(string sy, int mn) { double ZeroLevel=0; double BuyLots=0; double SellLots=0; double BuyProfit=0; double SellProfit=0; double SellLevel; double BuyLevel; int Total=OrdersTotal(); for(int i=Total-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()!=sy) continue; if(OrderMagicNumber() != mn) continue; if(OrderType()==OP_BUY) { BuyLots=BuyLots+OrderLots(); BuyProfit=BuyProfit+OrderProfit()+OrderCommission()+OrderSwap(); } if(OrderType()==OP_SELL) { SellLots=SellLots+OrderLots(); SellProfit=SellProfit+OrderProfit()+OrderCommission()+OrderSwap(); } } } double TickValue=MarketInfo(sy,MODE_TICKVALUE); if(BuyLots>0) BuyLevel=NormalizeDouble(MarketInfo(sy,MODE_BID)-(BuyProfit/(TickValue*BuyLots)*MarketInfo(sy,MODE_POINT)),(int)MarketInfo(sy,MODE_DIGITS)); else BuyLevel=0; if(SellLots>0) SellLevel=NormalizeDouble(MarketInfo(sy,MODE_ASK)+(SellProfit/(TickValue*SellLots)*MarketInfo(sy,MODE_POINT)),(int)MarketInfo(sy,MODE_DIGITS)); else SellLevel=0; if(BuyLevel>0) ZeroLevel=BuyLevel; if(SellLevel>0) ZeroLevel=SellLevel; return NormalizeDouble(ZeroLevel,_Digits);//Нормализовали полученную цену } //--- End --- //+---------------------------------------------------------------------------+ //| Функция открытия рыночной позиции (c) Boshetunmay 2021 | //+---------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента | //| op - операция | //| ll - лот | //| slipp - проскальзывание | //| sl - уровень стоп | //| tp - уровень тейк | //| comment - коментарий | //| mn - MagicNumber | //| cl - цвет значка открытия | //+---------------------------------------------------------------------------+ // OpenPosition(string symbol,int operation,double volume,int slippage,int stoploss,int takeprofit,string comment,int magic,color); int OpenPosition(string sy, int op, double ll, int slipp, int sl, int tp, string comment, int mn,color cl) { if(op == OP_BUY) // открытие BUY { // проверяем доступность свободных средств if((AccountFreeMarginCheck(sy,OP_BUY,ll)<=0) || (GetLastError()==134)) { Print(sy," ",ll," It is impossible to open the order Buy, not enough money."); return(0); } RefreshRates(); // открываем ордер OP_BUY int ticketbuy = OrderSend(sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),slipp,0,0,comment,mn,0,cl); if(ticketbuy<0) Print(sy," OpenPosition. OrderSend Buy fail #",GetLastError()); else Print(sy," OpenPosition. OrderSend Buy successfully"); Sleep(1000); // модифицируем ордер (выставляем тейпрофит и стоплосс) if(sl !=0 || tp !=0) { //--- получим минимальное значение Stop level double minstoplevel=MarketInfo(sy,MODE_STOPLEVEL); Print("Minimum Stop Level=",minstoplevel," points"); //--- вычисленные значения цен SL и TP должны быть нормализованы double BSLoss = NormalizeDouble(Zero_Level(_Symbol,mn)-(sl+minstoplevel)*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); double BTProfit = NormalizeDouble(Zero_Level(_Symbol,mn)+(tp+minstoplevel)*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); //--- если входящие значения ноль то заменяем цену модификации на ноль if(sl == 0) BSLoss = 0; if(tp == 0) BTProfit = 0; bool resbuy = OrderModify(ticketbuy,OrderOpenPrice(),BSLoss,BTProfit,0,clrNONE); if(!resbuy) Print(sy," OpenPosition. OrderModify Buy fail #",GetLastError()); else Print(sy," OpenPosition. OrderModify Buy successfully"); } } if(op == OP_SELL) // открытие Sell { // проверяем доступность свободных средств if((AccountFreeMarginCheck(sy,OP_SELL,ll)<=0) || (GetLastError()==134)) { Print(sy," ",ll," It is impossible to open the order Sell, not enough money."); return(0); } RefreshRates(); // открываем ордер OP_SELL int ticketsell = OrderSend(sy,OP_SELL,ll,MarketInfo(sy,MODE_BID),slipp,0,0,comment,mn,0,cl); if(ticketsell<0) Print(sy," OpenPosition. OrderSend Sell fail #",GetLastError()); else Print(sy," OpenPosition. OrderSend Sell successfully"); Sleep(1000); // модифицируем ордер (выставляем тейпрофит и стоплосс) if(sl !=0 || tp !=0) { //--- получим минимальное значение Stop level double minstoplevel=MarketInfo(sy,MODE_STOPLEVEL); Print("Minimum Stop Level=",minstoplevel," points"); //--- вычисленные значения цен SL и TP должны быть нормализованы double SSLoss = NormalizeDouble(Zero_Level(_Symbol,mn)+(sl+minstoplevel)*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); double STProfit = NormalizeDouble(Zero_Level(_Symbol,mn)-(tp+minstoplevel)*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); //--- если входящие значения ноль то заменяем цену модификации на ноль if(sl == 0) SSLoss = 0; if(tp == 0) STProfit = 0; bool ressell = OrderModify(ticketsell,OrderOpenPrice(),SSLoss,STProfit,0,clrNONE); if(!ressell) Print(sy," OpenPosition. OrderModify Sell fail #",GetLastError()); else Print(sy," OpenPosition. OrderModify Sell successfully"); } } return (1); } //--- End --- 今日のトレードフラグを返す //+----------------------------------------------------------------------------+ //| Описание : Возвращает флаг торгов сегодня. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int isTradeToDay(string sy="", int op=-1, int mn=-1) { int i, k=OrdersHistoryTotal(); if(sy=="0") sy=_Symbol; for(i=0; i<k; i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol()==sy || sy=="") { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(op<0 || OrderType()==op) { if(mn<0 || OrderMagicNumber()==mn) { if(TimeDay(OrderOpenTime())==Day() && TimeMonth(OrderOpenTime())==Month() && TimeYear(OrderOpenTime())==Year()) return(1); } } } } } } k=OrdersTotal(); for(i=0; i<k; i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==sy || sy=="") { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(op<0 || OrderType()==op) { if(mn<0 || OrderMagicNumber()==mn) { if(TimeDay(OrderOpenTime())==Day() && TimeMonth(OrderOpenTime())==Month() && TimeYear(OrderOpenTime())==Year()) return(1); } } } } } } return(0); } //--- End --- ポジションの数を 返します。 //+----------------------------------------------------------------------------+ //| Описание : Возвращает количество позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfPositions(string sy="", int op=-1, int mn=-1) { int i, k=OrdersTotal(), kp=0; if(sy=="0") sy=_Symbol; for(i=0; i<k; i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==sy || sy=="") { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(op<0 || OrderType()==op) { if(mn<0 || OrderMagicNumber()==mn) kp++; } } } } } return(kp); } //--- End --- すべて現在の端末のビルドに最適化されています。 Tretyakov Rostyslav 2021.10.08 22:22 #16539 Volodymyr Zubov ポジションの数を 返します。 すべて現在の端末のビルドに最適化されています。 指の意味がよくわからないのですが? Volodymyr Zubov 2021.10.08 22:30 #16540 MakarFX #: なぜ指があるのか理解できないのですが? OrderSendだけ置いて、何かおかしいと文句を言わないのは不適切だという指南がある。常にエラーを探さなければならない。 1...164716481649165016511652165316541655165616571658165916601661...1953 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
他の選択肢をご存知でしたら、お書きください。
人を助けることができる)
すべての変数をiniteで別々に作り、さらに処理で分ける(手抜きをする必要はない)。
次に、ブロックを括り、戻り値の変数を比較します。
initですべての変数を別々に作り、さらに処理で分ける (手抜きの必要はない)。
次に、ブロックを括り、戻り値の変数を比較します。
こんなところにも...。
フクロウ全体を掲載したかったのですが、フォーラムが許可してくれないのです。
どのフラグメントが必要ですか?
こんなところにも...。
どの作品が欲しいですか?
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
MQL4、MQL5の初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。
マカーFX さん 2021.10.08 18:43
私はあなたが関数で同一の指標の呼び出しをラップする必要があったと思います、コードはよりコンパクトになり、誰が知っている、今、あなたは4つのバーの指標の値を使用して、明日は5のために....
即ち
時々、特定のバーでトレードシグナルを持たないインジケータがあります。 私は通常、enum E_CMD{CMD_BUY,CMD_SELL,CMD_NONE}を使用します。
で、「シグナル」関数のシグネチャはE_CMD SignalByPuria(const int bar) となり、EAコード自体は以下のようなものになります。
この方法によって、すでに書かれているEAコードに新しい売買シグナルを素早く追加することができます。
同じインジケータの呼び出しを関数にまとめると、コードがよりコンパクトになり、また、今は4本のバーでインジケータ値を使用し、明日は5本で...といったことが可能になると思います。
即ち
時々、特定のバーでトレードシグナルを持たないインジケータがあります。 私は通常、enum E_CMD{CMD_BUY,CMD_SELL,CMD_NONE}を使用します。
で、「シグナル」関数のシグネチャはE_CMD SignalByPuria(const int bar) となり、EAコード自体は以下のようなものになります。
この方法によって、すでに書かれているEAコードに新しい売買シグナルを素早く追加することができます。
話を戻して、MT 4のマーケットポジションオープン 機能は以下の通りです。
今日のトレードフラグを返す
ポジションの数を 返します。
すべて現在の端末のビルドに最適化されています。
すべて現在の端末のビルドに最適化されています。
なぜ指があるのか理解できないのですが?
OrderSendだけ置いて、何かおかしいと文句を言わないのは不適切だという指南がある。常にエラーを探さなければならない。