[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要路过。没有你就无处可去 - 3. - 页 284 1...277278279280281282283284285286287288289290291...652 新评论 costy_ 2011.10.23 11:12 #2831 ZZZEROXXX: UP.将EA转换为脚本的原理简而言之,希望能得到帮助。 它更简单,就像这样。 Александр 2011.10.23 11:21 #2832 ZZZEROXXX: UP.将EA转换为脚本的原理简而言之,希望能得到帮助。 我不太清楚,但似乎如果你把EA移到脚本中,它就会像脚本一样工作。 Всеволод 2011.10.23 12:32 #2833 ZZZEROXXX: 我想了解一下将EA转换为脚本的原理。 那么剧本会怎么做呢? 通常情况下,终端被拔掉,从一个非标准的时间框架中写出一个CSV文件,然后加载,而不是任何符号和时期,在这个时期,测试。在开盘价 上确实如此,但没有太多的其他选择。 ZZZEROXXX 2011.10.23 13:48 #2834 splxgf: 那么剧本会怎么做呢? 通常情况下,终端被拔掉,从一个非标准的时间框架中写出一个CSV文件,然后加载,而不是任何符号和时期,这就是测试的时期。按开盘价计算确实如此,但实际上没有任何其他选择。 感谢所有回应的人。我喜欢用TF替代的变体,我会试试的。我最初打算打开一个非标准的TF单机,用专家顾问脚本将交易卸载到一个文件中。 Evgeny Potapov 2011.10.23 14:13 #2835 什么是。 最大缩水,%- 最大缩水百分比。 ? 你可以在策略优化器中指定这样的参数,但不清楚它是什么意思...... 1)与最初的存款相比,它是余额的最大减少量吗? 2) 股权最大值和最小值之间的最大差异是什么? 3)最低和最高保证金之间的区别? 我想到了许多其他的变体。 请解释(最大跌幅,%) 的确切含义。 Ruslana 2011.10.23 14:26 #2836 snail09: 开始了解你的代码。我很惊讶。你所附的东西不能工作。你可以看到它是由零碎的东西组成的,但至少支架是正确的。 代码有两部分,这是我的专家。请看一看。 //+------------------------------------------------------------------+ //| rusa_v4.mq4 | //| //| | //+------------------------------------------------------------------+ #property copyright "" #property link "https://www.mql5.com/ru/users/avoitenko" //--- Внешние переменные extern string General = "=== General settings ==="; extern int TakeProfit_Buy = 260; // Тейк профит для Buy extern int StopLoss_Buy = 120; // Стоп лосс для Buy extern int TakeProfit_Sell = 140; // Тейк профит для Sell extern int StopLoss_Sell = 110; // Стоп лосс для Sell extern int TrailingStop = 0; // Трейлинг стоп extern double Lots = 0.02; // Лот extern int Slippage = 10; // Проскальзывание extern int BarsShift = 0; // Смещение в барах для анализа сигнала extern int Magic = 555; // Уникальный номер советника extern string MA1 = "=== #1 Moving Average settings ==="; extern int MA1_period = 15; // Период скользящей средней extern int MA1_shift = 0; // Смещение скользящей средней extern int MA1_method = 1; // MODE_SMA=0,MODE_EMA=1,MODE_SMMA=2,MODE_LWMA =3; extern int MA1_price = 2; // PRICE_CLOSE=0,PRICE_OPEN=1,PRICE_HIGH=2,PRICE_LOW=3,PRICE_MEDIAN=4,PRICE_TYPICAL=5,PRICE_WEIGHTED=6; extern string MA2 = "=== #2 Moving Average settings ==="; extern int MA2_period = 20; extern int MA2_shift = 0; extern int MA2_method = 0; extern int MA2_price = 0; extern string MA3 = "=== #3 Moving Average settings ==="; extern int MA3_period = 70; extern int MA3_shift = 8; extern int MA3_method = 2; extern int MA3_price = 3; extern string RSI = "=== RSI settings ==="; extern int RSI_period = 14; // Период RSI extern int RSI_price = 3; // PRICE_CLOSE=0,PRICE_OPEN=1,PRICE_HIGH=2,PRICE_LOW=3,PRICE_MEDIAN=4,PRICE_TYPICAL=5,PRICE_WEIGHTED=6; extern int macd_fast = 12; extern int macd_slow = 15; extern int macd_signal = 1; extern int macd_price = 3; // 0-PRICE_CLOSE, 1-PRICE_OPEN, 2-PRICE_HIGH, 3-PRICE_LOW, 4-PRICE_MEDIAN, 5-PRICE_TYPICAL, 6-PRICE_WEIGHTED extern int macd_open = 7; //--- Глобальные переменные double lot; // лот double ma10,ma20,ma30,ma11,ma21,ma31,rsi, macd; int stop_loss_buy; // стоп лосс int take_profit_buy; // тейк профит int stop_loss_sell; // стоп лосс int take_profit_sell; // тейк профит int slippage; // проскальзывание int trailing_stop; // трейлинг стоп int min_level; // минимальный отступ от цены для установки SL / TP int bars_shift; // смещение в барах для торговых сигналов int bars_count; // минимальное число баров для работы datetime candle_time = 0; bool sell_open = false; // флаг открытия позиции sell bool buy_open = false; // флаг открытия позиции buy bool new_bar_buy = false; // флаг нового бара bool new_bar_sell = false; // флаг нового бара //+------------------------------------------------------------------+ int init() //+------------------------------------------------------------------+ { //--- проверка правильности ввода данных bars_shift = BarsShift; if(bars_shift < 0)bars_shift = 0; bars_count = MathMax4(MA1_period, MA2_period, MA3_period, RSI_period) + bars_shift; //--- инициализация переменных stop_loss_buy = StopLoss_Buy; take_profit_buy = TakeProfit_Buy; stop_loss_sell = StopLoss_Sell; take_profit_sell = TakeProfit_Sell; slippage = Slippage; trailing_stop = TrailingStop; //--- Если цена состоит из 3-x / 5-и цифр if((Digits==3) || (Digits==5)) { stop_loss_buy = stop_loss_buy * 10; take_profit_buy = take_profit_buy * 10; stop_loss_sell = stop_loss_sell * 10; take_profit_sell = take_profit_sell * 10; slippage = slippage * 10; trailing_stop = trailing_stop * 10; } Print("Советник начал свою работу"); return(0); } bool macd_up(int timeframe, int fast, int slow, int signal, int price, int num) { double y; double x = iMACD(NULL,timeframe,fast,slow,signal,price,MODE_MAIN,0)*100000; for (int i=1; i<num; i++) { y = iMACD(NULL,timeframe,fast,slow,signal,price,MODE_MAIN,i)*100000; if (y > x) return(false); else x = y; } return(true); } //+------------------------------------------------------------------+ bool macd_down(int timeframe, int fast, int slow, int signal, int price, int num) { double y; double x = iMACD(NULL,timeframe,fast,slow,signal,price,MODE_MAIN,0)*100000; for (int i=1; i<num; i++) { y = iMACD(NULL,timeframe,fast,slow,signal,price,MODE_MAIN,i)*100000; if (y < x) return(false); else x = y; } return(true); } //+------------------------------------------------------------------+ int deinit() //+------------------------------------------------------------------+ { Print("Советник завершил свою работу"); return(0); } //+------------------------------------------------------------------+ int start() //+------------------------------------------------------------------+ { //--- Разрешение на открытие позиций - каждую свечу if(candle_time != Time[0]) { candle_time = Time[0]; new_bar_buy = true; new_bar_sell = true; } if (Bars < bars_count){Print("Мало данных для работы"); return(0);} //--- Получение значений индикатора iMA ma10 = iMA ( Symbol(), Period(), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift); ma20 = iMA ( Symbol(), Period(), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift); ma30 = iMA ( Symbol(), Period(), MA3_period, MA3_shift, MA3_method, MA3_price, bars_shift); ma11 = iMA ( Symbol(), Period(), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift+1); ma21 = iMA ( Symbol(), Period(), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift+1); rsi = iRSI ( Symbol(), Period(), RSI_period, RSI_price, bars_shift); macd = iMACD(NULL,0,macd_fast,macd_slow,macd_signal,macd_price,MODE_MAIN,0); { if (macd <0) { if (macd_down(0,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return(true); { //--- Условие для продажи if(ma11 < ma21 && ma10 > ma20 && ma30 > ma10 && rsi<50 && new_bar_sell) { sell_open=true; new_bar_sell = false; } } } } { if (macd > 0) { if (macd_up(0,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return(true); { //--- Условие для продажи if(ma11 > ma21 && ma10 < ma20 && ma30 < ma10 && rsi>50 && new_bar_buy) { buy_open=true; new_bar_buy = false; } } } } { if (macd > 0) { if (macd_up(0,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return(true); { //--- Условие для покупки if(ma11 < ma21 && ma10 > ma20 && ma30 > ma10 && rsi>50 && new_bar_buy) { buy_open=true; new_bar_buy = false; } } } { if (macd < 0) { if (macd_down(0,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return(true); { //--- Условие для продажи if(ma11 > ma21 && ma10 < ma20 && ma30 < ma10 && rsi<50 && new_bar_sell) { sell_open=true; new_bar_sell = false; } } } } } //--- выставление рыночных ордеров if(IsTradeAllowed()) { Trade_BUY(); Trade_SELL(); } return(0); } Ruslana 2011.10.23 14:29 #2837 rusa: 第二部分 //+------------------------------------------------------------------+ void Trade_BUY() //+------------------------------------------------------------------+ { for ( int i = 0; i < OrdersTotal(); i++ ) { if ( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) ) { if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != Magic)) continue; //не наш ордер if ( OrderType() == OP_BUY) // если ордер OP_BUY { min_level = MarketInfo( Symbol(), MODE_STOPLEVEL ); //--- проверка на работу трейлинг стопа if (trailing_stop !=0.0 && Ask > NormalizeDouble(OrderStopLoss() + (stop_loss_buy + MathMax(min_level, trailing_stop)) * Point, Digits) && OrderProfit() > 0) { if ( OrderModify ( OrderTicket(), OrderOpenPrice(), NormalizeDouble (OrderStopLoss() + MathMax(min_level, trailing_stop) * Point, Digits), OrderTakeProfit(), 0, CLR_NONE)) { Print("Сработал трейлинг стоп для Buy"); } else { Print ("Ошибка модификации ордера #", GetLastError()); } RefreshRates(); Sleep(3000); } //end modify }// end BUY }//end OrderSelect else { Print( "OrderSelect ошибка #", GetLastError() ); Sleep(3000); RefreshRates(); return; } }// end for //--- Открываем ордер если есть сигнал while (buy_open) { //--- нормализация лота lot = Normalize_Lot(Lots); //--- проверка на наличие свободной маржи if( AccountFreeMarginCheck(Symbol(),OP_BUY, lot) <= 0 || GetLastError() == 134 ) { Print("Недостаточно свободной маржи для открытия ордера"); buy_open = false; break; } min_level = MarketInfo( Symbol(), MODE_STOPLEVEL ); if ( OrderSend( Symbol(), OP_BUY, lot, NormalizeDouble(Ask, Digits), slippage, NormalizeDouble(Bid - MathMax(stop_loss_buy, min_level) * Point, Digits), NormalizeDouble(Bid + MathMax(take_profit_buy,min_level) * Point, Digits), DoubleToStr(Magic, 0), Magic, 0, Blue) > 0 ) { PlaySound("Wait.wav"); buy_open = false; // ордер открыт break; } else { int Error = GetLastError(); // Не получилось :( switch(Error) // Преодолимые ошибки { case 138:Alert("Ошибка: ",Error," Новые цены."); RefreshRates(); continue; case 135:Alert("Ошибка: ",Error," Цена изменилась."); RefreshRates(); continue; case 136:Alert("Нет цен."); while(RefreshRates() == false) Sleep(500); continue; case 146:Alert("Подсистема торговли занята."); Sleep(500); RefreshRates(); continue; default: Alert("Возникла ошибка ", Error," Выход из подпрограммы."); // Другие варианты ошибок }// end switch }// end else break; }// end while }// end Trade_BUY //+------------------------------------------------------------------+ void Trade_SELL() //+------------------------------------------------------------------+ { for ( int i = 0; i < OrdersTotal(); i++ ) { if ( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) ) { if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != Magic)) continue; //не наш ордер if ( OrderType() == OP_SELL) //если ордер OP_SELL { min_level = MarketInfo( Symbol(), MODE_STOPLEVEL ); //--- проверка на работу трейлинг стопа if (trailing_stop !=0.0 && Bid < NormalizeDouble(OrderStopLoss() - (stop_loss_sell + MathMax(min_level, trailing_stop)) * Point, Digits)&&OrderProfit() > 0) { if ( OrderModify ( OrderTicket(), OrderOpenPrice(), NormalizeDouble (OrderStopLoss() - MathMax(min_level, trailing_stop) * Point, Digits), OrderTakeProfit(), 0, CLR_NONE)) { Print("Сработал трейлинг стоп для Sell"); } else { Print ( "Ошибка модификации ордера #", GetLastError()); } RefreshRates(); Sleep(3000); } }// end BUY }//end OrderSelect else { Print( "OrderSelect ошибка #", GetLastError() ); Sleep(3000); RefreshRates(); return; } }// end for //--- Открываем ордер если есть сигнал while (sell_open) { //--- нормализация лота lot = Normalize_Lot(Lots); //--- проверка на наличие свободной маржи if( AccountFreeMarginCheck(Symbol(),OP_SELL, lot) <= 0 || GetLastError() == 134 ) { Print("Недостаточно свободной маржи для открытия ордера"); sell_open = false; break; } min_level = MarketInfo( Symbol(), MODE_STOPLEVEL ); if ( OrderSend( Symbol(), OP_SELL, lot, NormalizeDouble(Bid, Digits), slippage, NormalizeDouble(Ask + MathMax(stop_loss_sell, min_level) * Point, Digits), NormalizeDouble(Ask - MathMax(take_profit_sell, min_level) * Point, Digits), DoubleToStr(Magic, 0), Magic, 0, Red) > 0 ) { PlaySound("Wait.wav"); sell_open = false; // ордер открыт break; } else { int Error = GetLastError(); // Не получилось :( switch(Error) // Преодолимые ошибки { case 138:Alert("Ошибка: ",Error," Новые цены."); RefreshRates(); continue; case 135:Alert("Ошибка: ",Error," Цена изменилась."); RefreshRates(); continue; case 136:Alert("Нет цен."); while(RefreshRates() == false) Sleep(500); continue; case 146:Alert("Подсистема торговли занята."); Sleep(500); RefreshRates(); continue; default: Alert("Возникла ошибка ", Error," Выход из подпрограммы."); // Другие варианты ошибок }// end switch }// end else break; }// end while }// end Trade_SELL //+------------------------------------------------------------------+ double Normalize_Lot(double lot)// Проверка на допустимое значение лота //+------------------------------------------------------------------+ { double lot_min = MarketInfo(Symbol(), MODE_MINLOT); double lot_max = MarketInfo(Symbol(), MODE_MAXLOT); double lot_step = MarketInfo(Symbol(), MODE_LOTSTEP); if ( lot <= lot_min ) lot = lot_min; // минимальный else if ( lot >= lot_max ) lot = lot_max; // максимальный else lot = MathFloor( lot / lot_step ) * lot_step ; // округление до ближайшего меньшего return(lot); } //+------------------------------------------------------------------+ int MathMax4(int i1,int i2,int i3,int i4)// Возврат максимального значения //+------------------------------------------------------------------+ { int imax=i1; if(i2>imax)imax=i2; if(i3>imax)imax=i3; if(i4>imax)imax=i4; return(imax); } [删除] 2011.10.23 15:48 #2838 你能告诉我,如果其中一个挂单已经触发,如何删除挂单?一共设置了两个挂单。 Boris 2011.10.23 16:00 #2839 ArgentumZ:你好!在测试器上运行EA。服务器是四位数。当在日志中放置买入或卖出订单时,说2011.10.23 15:27:26 2010.12.16 06:16 test_sovetnik GBPUSD,H1: open #1 buy 0.10 GBPUSD at 1.5551 sl: 1.4551 tp: 1.5586 ok但开盘价为1.55512 !在五位数上。然后,挂单以四位数下单,也以四位数触发。但OP_SELL和OP_BUY的开盘价只有五位数!我做了NormalizeDouble(Ask,Digits)。没有什么是有效的!请告知如何解决这个问题?当然,你可以忽略最后一位数字。错误并没有发生,但为了实验的纯粹性,我需要所有的交易都以四位数进行。 很可能你的MT4和服务器有一个五位数的报价,像我一样。所以,一切都要乘以10,因为数字=5。 Cmu4 2011.10.23 16:09 #2840 Parn25: 如果其中一个订单被触发,我如何删除一个挂单?总共有两个挂单设置。 你可以手动操作。右键单击,然后...:) 你可以应用一个脚本或一个专家顾问。你喜欢哪一个?XD 1...277278279280281282283284285286287288289290291...652 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
UP.将EA转换为脚本的原理简而言之,希望能得到帮助。
UP.将EA转换为脚本的原理简而言之,希望能得到帮助。
我不太清楚,但似乎如果你把EA移到脚本中,它就会像脚本一样工作。
我想了解一下将EA转换为脚本的原理。
那么剧本会怎么做呢?
通常情况下,终端被拔掉,从一个非标准的时间框架中写出一个CSV文件,然后加载,而不是任何符号和时期,在这个时期,测试。在开盘价 上确实如此,但没有太多的其他选择。
那么剧本会怎么做呢?
通常情况下,终端被拔掉,从一个非标准的时间框架中写出一个CSV文件,然后加载,而不是任何符号和时期,这就是测试的时期。按开盘价计算确实如此,但实际上没有任何其他选择。
感谢所有回应的人。我喜欢用TF替代的变体,我会试试的。我最初打算打开一个非标准的TF单机,用专家顾问脚本将交易卸载到一个文件中。
什么是。
最大缩水,%- 最大缩水百分比。
你可以在策略优化器中指定这样的参数,但不清楚它是什么意思......
1)与最初的存款相比,它是余额的最大减少量吗?
2) 股权最大值和最小值之间的最大差异是什么?
3)最低和最高保证金之间的区别?
我想到了许多其他的变体。
请解释(最大跌幅,%) 的确切含义。
开始了解你的代码。我很惊讶。你所附的东西不能工作。你可以看到它是由零碎的东西组成的,但至少支架是正确的。
代码有两部分,这是我的专家。请看一看。
第二部分
你好!
在测试器上运行EA。服务器是四位数。当在日志中放置买入或卖出订单时,说
2011.10.23 15:27:26 2010.12.16 06:16 test_sovetnik GBPUSD,H1: open #1 buy 0.10 GBPUSD at 1.5551 sl: 1.4551 tp: 1.5586 ok
但开盘价为1.55512 !在五位数上。然后,挂单以四位数下单,也以四位数触发。但OP_SELL和OP_BUY的开盘价只有五位数!
我做了NormalizeDouble(Ask,Digits)。
没有什么是有效的!请告知如何解决这个问题?
当然,你可以忽略最后一位数字。错误并没有发生,但为了实验的纯粹性,我需要所有的交易都以四位数进行。
很可能你的MT4和服务器有一个五位数的报价,像我一样。所以,一切都要乘以10,因为数字=5。
如果其中一个订单被触发,我如何删除一个挂单?总共有两个挂单设置。
你可以手动操作。右键单击,然后...:)
你可以应用一个脚本或一个专家顾问。你喜欢哪一个?XD