初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1324 1...131713181319132013211322132313241325132613271328132913301331...1503 新评论 SanAlex 2021.07.01 10:30 #13231 Alexey Viktorov:昨天我下载了这个奇迹来观看......突然间我就没有网络了。一场雷雨过后,我在当天剩下的时间里都有技术工作。所以我决定用MQL5重写它,并在这里 发表。因此,每朵云都有一线生机......... 我给你的专家顾问添加了一个指标--我想你不会介意的!我想它的效果和Sprut 想的一样185 (黄色的我把它加到我现有的专家顾问这里)。 //+------------------------------------------------------------------+ //| 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:我在你的专家顾问中添加了一个指标--我想你不会介意的!? 它似乎按照Sprut 的要求工作了185(黄色的我把它加到我现有的专家顾问这里)。 还有,为什么指标值来自三条杠?而为什么要把数组翻成时间序列? 总的来说,在我看来,这不是正确的......没有马丁会工作。 SanAlex 2021.07.01 11:04 #13233 Alexey Viktorov:为什么你需要三个柱状图的指标值?而为什么要把数组翻成时间序列?在一般情况下,在我看来,情况并非如此......没有马汀就不会成功。 这里的指标只是一个方向过滤器--而你的专家顾问完成了整个任务 \\\\\\\\\\\\\ 该指标本身并不开仓。 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万。 在15天内将指标和5min Eurobucks改变为一百万。 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 添加到专家顾问 - 关闭利润(从所有货币对)并删除专家顾问 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(); } //--- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 我需要这两个指标 (指标名称 不应改变)。 附加的文件: 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:在15天内将指标和5min eurobucks换成了一百万。 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\在专家顾问中添加了 - 通过总利润(来自所有货币对)来关闭利润并删除专家顾问\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\我需要这两个指标的存在(即 指标名称 不会改变)。 在设置中没有足够的止损 Aleksei Skrypnev 2021.07.01 20:29 #13239 有一些方法可以用类似于 "n "的方法将一个字符串分割成多个字符串。 有什么方法可以将一个字符串变量分割成一个单一的字符串吗? 也就是把这个字符串变量中的所有文本、数值、参数等都写入一个字符串中。 问题发生在写入csv时(字符串变量值被写成一堆字符串)。 SanAlex 2021.07.02 03:26 #13240 Vitaly Muzichenko:在设置中没有足够的止损 有了止损,就不再有相同的利润 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 我认为专家顾问需要更经常地重新启动--例如,我把本周的总利润(来自所有货币对),从所有货币对中删除专家顾问。 并重新启动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,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
昨天我下载了这个奇迹来观看......突然间我就没有网络了。一场雷雨过后,我在当天剩下的时间里都有技术工作。所以我决定用MQL5重写它,并在这里 发表。
因此,每朵云都有一线生机.........
我给你的专家顾问添加了一个指标--我想你不会介意的!我想它的效果和Sprut 想的一样185
(黄色的我把它加到我现有的专家顾问这里)。
我在你的专家顾问中添加了一个指标--我想你不会介意的!? 它似乎按照Sprut 的要求工作了185
(黄色的我把它加到我现有的专家顾问这里)。
还有,为什么指标值来自三条杠?而为什么要把数组翻成时间序列?
总的来说,在我看来,这不是正确的......没有马丁会工作。
为什么你需要三个柱状图的指标值?而为什么要把数组翻成时间序列?
在一般情况下,在我看来,情况并非如此......没有马汀就不会成功。
这里的指标只是一个方向过滤器--而你的专家顾问完成了整个任务
\\\\\\\\\\\\\
该指标本身并不开仓。
这里的指标只是一个方向性的过滤器--而你的专家完成了整个任务
写好的代码应该能完成任务。但你设置了这样一个条件,使马汀永远不会开启。我想是的,但我没有愿望或时间去检查。
这个任务必须由你写的代码来完成。但你已经提出了一个条件,那就是马丁永远不会开机。我想是的,但我没有愿望或时间去检查。
在这里,我正在检查它的工作--一切都按计划进行。
马丁应该只在指标信号相反时激活,还是不管?
例如:根据指标建立了一个买入头寸。价格已经下跌了设定的距离,指标已经显示为卖出。是否应该打开买入仓位?
正如承诺的那样--我拍了一些照片。
如果不清楚,我只有在与你当面交谈时才能解释我的想法的含义。
我在这里做错了什么--我不知道什么东西从10万卢布变成了200万。
在15天内将指标和5min Eurobucks改变为一百万。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
添加到专家顾问 - 关闭利润(从所有货币对)并删除专家顾问
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
我需要这两个指标 (指标名称 不应改变)。
在15天内将指标和5min eurobucks换成了一百万。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
在专家顾问中添加了 - 通过总利润(来自所有货币对)来关闭利润并删除专家顾问
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
我需要这两个指标的存在(即 指标名称 不会改变)。
在设置中没有足够的止损
有一些方法可以用类似于 "n "的方法将一个字符串分割成多个字符串。
有什么方法可以将一个字符串变量分割成一个单一的字符串吗?
也就是把这个字符串变量中的所有文本、数值、参数等都写入一个字符串中。
问题发生在写入csv时(字符串变量值被写成一堆字符串)。
在设置中没有足够的止损
有了止损,就不再有相同的利润
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
我认为专家顾问需要更经常地重新启动--例如,我把本周的总利润(来自所有货币对),从所有货币对中删除专家顾问。
并重新启动EA,直到所有交易的总利润达到新的水平。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
关于止损的另一个想法--止损不是为了平仓,而是为了开一个相反的仓位,有很多相反的(亏损的)仓位
这里是未平仓合约 的账户
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
原因是止损不平仓,相反的手数应该有助于手动交易。