初学者的问题 MQL5 MT5 MetaTrader 5 - 页 252 1...245246247248249250251252253254255256257258259...1503 新评论 --- 2014.05.21 09:35 #2511 对吗? 附加的文件: 11.zip 7 kb Nauris Zukas 2014.05.21 10:16 #2512 sergeev: 对吗? 它显示了 错误。做了 一切 工作顺利吗? 不能打开 "C:\Program Files\Alpari Limited MT5 Demo 1\MQL5\include\Expert\Signal\MySignals\ACH_HM_RSI。包括文件 expert_ah_hm_rsi.mq5 14 11 --- 2014.05.21 10:24 #2513 abeiks: 它显示了 错误。做了 一切 工作顺利吗? 不能打开 "C:\Program Files\Alpari Limited MT5 Demo 1\MQL5\include\Expert\Signal\MySignals\ACH_HM_RSI。包括文件 expert_ah_hm_rsi.mq5 14 11我愿意。把文件放到指定的文件夹中。 Nauris Zukas 2014.05.21 10:37 #2514 sergeev:我是。把文件放到指定的文件夹中。 谢谢你,它正在工作!:) Евгений 2014.05.21 14:03 #2515 大家好!我正在对CrossArbitr指标进行微调。帮助我理解。我需要b(Total)的值在一分钟内(0 bar)加起来s,并与其他指标一起显示在图表上,一分钟后,s的总和被固定,s1=s,开始重新形成。指标s1一个也需要在图表上显示。以下是该指标的代码。 //+------------------------------------------------------------------+ //| CrossArbitr.mq4 | //| Scriptong | //| | //+------------------------------------------------------------------+ #property copyright "Scriptong" #property link "" #property indicator_chart_window //---- input parameters extern bool ShowBid=false; extern bool ShowAsk=false; extern color BidColor = Lime; extern color AskColor = Yellow; extern int AlarmIfPointDifference = 10; extern string AlarmFile = "wait.wav"; bool Activate = False; string FP, SP; double Tick; int WayForCross; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators string S = Symbol(); if(StringFind(S, "USD", 0) != -1) { Comment("Индикатор работает только с кроссовыми парами (GBPJPY, EURJPY, EURGBP и т. д)!"); return(0); } if(StringLen(S) != 6) { Comment("Индикатор работает только с валютными парами, у которых название состоит из шести символов!"); return(0); } // Поиск первой валютной пары кросса FP = StringSubstr(S, 0, 3)+"USD"; MarketInfo(FP, MODE_BID); if(GetLastError() > 0) { FP = "USD"+StringSubstr(S, 0, 3); MarketInfo(FP, MODE_BID); if(GetLastError() > 0) { Comment("Невозможно найти инструмент ", FP, " или ", StringSubstr(S, 0, 3)+"USD. Необходимо добавить его в Обзоре рынка и перезапустить индикатор."); return(0); } } // -------------------------------------- // "Создание" второй валютной пары кросса SP = "USD"+StringSubstr(S, 3, 3); MarketInfo(SP, MODE_BID); if(GetLastError() > 0) { SP = StringSubstr(S, 3, 3)+"USD"; MarketInfo(SP, MODE_BID); if(GetLastError() > 0) { Comment("Невозможно найти инструмент ", SP, " или ", StringSubstr(S, 3, 3)+"USD. Необходимо добавить его в Обзоре рынка и перезапустить индикатор."); return(0); } } // -------------------------------------- // Определение пути синтеза кросса if (StringFind(FP, "USD") == 3 && StringFind(SP, "USD") == 0) WayForCross = 1; if (StringFind(FP, "USD") == 0 && StringFind(SP, "USD") == 0) WayForCross = 2; if (StringFind(FP, "USD") == 3 && StringFind(SP, "USD") == 3) WayForCross = 3; if (StringFind(FP, "USD") == 0 && StringFind(SP, "USD") == 3) WayForCross = 4; // ------------------------------- Tick = MarketInfo(Symbol(), MODE_TICKSIZE); Activate = True; //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- Comment(""); if(ObjectFind("CrossBid") == 0) ObjectDelete("CrossBid"); if(ObjectFind("CrossAsk") == 0) ObjectDelete("CrossAsk"); //---- return(0); } //+------------------------------------------------------------------+ //| Приведение значений к точности одного тика | //+------------------------------------------------------------------+ double ND(double A) { return(NormalizeDouble(A, Digits)); } //+------------------------------------------------------------------+ //| Расчет значения синтетического бида | //+------------------------------------------------------------------+ double CalcBidWayForCross() { switch (WayForCross) { case 1: return(ND(MarketInfo(FP, MODE_BID)*MarketInfo(SP, MODE_BID))); case 2: return(ND(MarketInfo(SP, MODE_BID)/MarketInfo(FP, MODE_ASK))); case 3: return(ND(MarketInfo(FP, MODE_BID)/MarketInfo(SP, MODE_ASK))); case 4: return(1/(ND(MarketInfo(FP, MODE_ASK)*MarketInfo(SP, MODE_BID)))); } } //+------------------------------------------------------------------+ //| Расчет значения синтетического аска | //+------------------------------------------------------------------+ double CalcAskWayForCross() { switch (WayForCross) { case 1: return(ND(MarketInfo(FP, MODE_ASK)*MarketInfo(SP, MODE_ASK))); case 2: return(ND(MarketInfo(SP, MODE_ASK)/MarketInfo(FP, MODE_BID))); case 3: return(ND(MarketInfo(FP, MODE_ASK)/MarketInfo(SP, MODE_BID))); case 4: return(1/(ND(MarketInfo(FP, MODE_BID)*MarketInfo(SP, MODE_ASK)))); } } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- if(!Activate) return(0); // Расчет синтетических Bid и Ask double CalcBid = CalcBidWayForCross(); RefreshRates(); double CalcAsk = CalcAskWayForCross(); double n,m,b,s,s1; int t = Seconds(); // ------------------------------- // Рисуем уровень синтетического Bid if (ShowBid) { if(ObjectFind("CrossBid") == -1) { ObjectCreate("CrossBid", OBJ_HLINE, 0, 0, CalcBid); ObjectSet("CrossBid", OBJPROP_COLOR, BidColor); ObjectSet("CrossBid", OBJPROP_STYLE, STYLE_DOT); } else if(!ObjectMove("CrossBid", 0, 1, CalcBid)) Print("Ошибка перемещения №", GetLastError()); } // ---------------------------------- // Рисуем уровень синтетического Ask if(ShowAsk) { if(ObjectFind("CrossAsk") == -1) { ObjectCreate("CrossAsk", OBJ_HLINE, 0, 0, CalcAsk); ObjectSet("CrossAsk", OBJPROP_COLOR, AskColor); ObjectSet("CrossAsk", OBJPROP_STYLE, STYLE_DOT); } else ObjectMove("CrossAsk", 0, 1, CalcAsk); if(t > 0) {s=b; b++;} else s1=s; } // ---------------------------------- Comment("Реальный BID = ", DoubleToStr(Bid, Digits), ", реальный ASK = ", DoubleToStr(Ask, Digits), "\nСинтетик BID = ", DoubleToStr(CalcBid, Digits), ", синтетик ASK = ", DoubleToStr(CalcAsk, Digits), "\nРазница BID Синтетика и Реального =", n=(Bid-CalcBid), "\, Разница ASK Синтетика и Реального =", m=(CalcAsk-Ask), "\nИтог =", b=(CalcAsk-Ask) - (Bid-CalcBid), "\nПрошлый бар =", s1, ", Текущий бар =", s ); // Выдаем звуковой сигнал о превышении минимальной разности if(ND(MathAbs(CalcBid-Bid)) >= ND(AlarmIfPointDifference*Point)) PlaySound(AlarmFile); // -------------------------------------------------------- //---- return(0); } //+------------------------------------------------------------------+ Евгений 2014.05.21 14:10 #2516 另外,我试图在一个图表上安装Exp-Monitoring-Spread专家顾问--它没有被安装。MT4在日志中写道,这不是一个专家顾问,不能安装。没有检测到编译器中的错误。它以脚本形式运行,但离线图表却不工作。可以做什么?为了以防万一,我们附上了代码。#property show_inputs #import "user32.dll" int PostMessageA(int hWnd,int Msg,int wParam,int lParam); #import #define WM_COMMAND 0x0111 #define PAUSE 100 extern string Currency = "USD"; string Symbol1, Symbol2; bool Math; // 0 - S1 / S2, 1 - S1 * S2, 2 - 1 / (S1 * S2) int handle; string SymbolName; int time; double open, low, high, close; int volume; double PriceBid, PriceAsk; double Bid1 = 0, Bid2 = 0, Ask1 = 0, Ask2 = 0; int Digits1, Digits2; double MinSpread, MaxSpread, AverageSpread; bool RealSymbol( string Str ) { return(MarketInfo(Str, MODE_BID) != 0); } void GetSymbols() { string Currency1, Currency2; string SymbolPrefix; string Str1, Str2; Currency1 = StringSubstr(Symbol(), 0, 3); Currency2 = StringSubstr(Symbol(), 3, 3); SymbolPrefix = StringSubstr(Symbol(), 6, StringLen(Symbol()) - 6); Str1 = Currency1 + Currency + SymbolPrefix; Str2 = Currency + Currency1 + SymbolPrefix; if (RealSymbol(Str1)) { Symbol1 = Str1; Str1 = Currency2 + Currency + SymbolPrefix; Str2 = Currency + Currency2 + SymbolPrefix; if (RealSymbol(Str1)) { Symbol2 = Str1; Math = 0; // S1 / S2 } else if (RealSymbol(Str2)) { Symbol2 = Str2; Math = 1; // S1 * S2 } } else if (RealSymbol(Str2)) { Symbol2 = Str2; Str1 = Currency2 + Currency + SymbolPrefix; Str2 = Currency + Currency2 + SymbolPrefix; if (RealSymbol(Str1)) { Symbol1 = Str1; Math = 2; // 1 / (S1 * S2) } else if (RealSymbol(Str2)) { Symbol1 = Str2; Math = 0; // S1 / S2 } } return; } bool GetPrices() { switch (Math) { case 0: // S1 / S2 PriceBid = Bid1 / Ask2; PriceAsk = Ask1 / Bid2; break; case 1: // S1 * S2 PriceBid = Bid1 * Bid2; PriceAsk = Ask1 * Ask2; break; case 2: // 1 / (S1 * S2) PriceBid = 1 / (Ask1 * Ask2); PriceAsk = 1 / (Bid1 * Bid2); break; } return; } bool SymbolChange() { double NewBid1, NewBid2, NewAsk1, NewAsk2; NewBid1 = MarketInfo(Symbol1, MODE_BID); NewBid2 = MarketInfo(Symbol2, MODE_BID); NewAsk1 = MarketInfo(Symbol1, MODE_ASK); NewAsk2 = MarketInfo(Symbol2, MODE_ASK); if ((NormalizeDouble(NewBid1 - Bid1, Digits1) != 0) || (NormalizeDouble(NewBid2 - Bid2, Digits2) != 0) || (NormalizeDouble(NewAsk1 - Ask1, Digits1) != 0) || (NormalizeDouble(NewAsk2 - Ask2, Digits2) != 0)) { Bid1 = NewBid1; Bid2 = NewBid2; Ask1 = NewAsk1; Ask2 = NewAsk2; GetPrices(); return(TRUE); } return(FALSE); } void WriteBar() { FileWriteInteger(handle, time); FileWriteDouble(handle, open); FileWriteDouble(handle, low); FileWriteDouble(handle, high); FileWriteDouble(handle, close); FileWriteDouble(handle, volume); FileFlush(handle); return; } int GetLastTime() { int Tmp1, Tmp2; Tmp1 = iTime(Symbol1, Period(), 0); Tmp2 = iTime(Symbol2, Period(), 0); if (Tmp1 > Tmp2) return(Tmp1); return(Tmp2); } void CreateNewBar() { time = GetLastTime(); open = PriceBid; low = PriceBid; high = PriceBid; close = PriceBid; volume = 1; return; } void ModifyBar() { if (PriceBid > high) high = PriceBid; else if (PriceBid < low) low = PriceBid; close = PriceBid; volume++; } void CreateNewSpread() { MinSpread = (PriceAsk - PriceBid) / Point; MaxSpread = MinSpread; AverageSpread = MinSpread; return; } void ModifySpread() { double Spread = (PriceAsk - PriceBid) / Point; if (Spread > MaxSpread) MaxSpread = Spread; else if (Spread < MinSpread) MinSpread = Spread; AverageSpread += Spread; return; } void WriteSpread() { int hSpread = FileOpen(SymbolName + Period() + "_Spread.dat", FILE_BIN|FILE_READ|FILE_WRITE); AverageSpread /= volume; FileSeek(hSpread, 0, SEEK_END); FileWriteInteger(hSpread, time); FileWriteDouble(hSpread, MaxSpread); FileWriteDouble(hSpread, AverageSpread); FileWriteDouble(hSpread, MinSpread); FileClose(hSpread); return; } void CreateHandle() { string FileName; int Tmp[15], TmpTime; SymbolName = StringSubstr(Symbol(), 0, 6) + "_" + Currency; FileName = SymbolName + Period() + ".hst"; handle = FileOpenHistory(FileName, FILE_BIN|FILE_READ|FILE_WRITE); if (FileSize(handle) > 0) { if (FileSize(handle) > 148) { FileSeek(handle, -44, SEEK_END); TmpTime = FileReadInteger(handle); if (TmpTime == time) { open = FileReadDouble(handle); low = FileReadDouble(handle); high = FileReadDouble(handle); close = FileReadDouble(handle); volume = FileReadDouble(handle); return; } } FileSeek(handle, 0, SEEK_END); return; } FileClose(handle); handle = FileOpenHistory(FileName, FILE_BIN|FILE_WRITE); FileWriteInteger(handle, 400); FileWriteString(handle, "Created by " + WindowExpertName(), 64); FileWriteString(handle, SymbolName, 12); FileWriteInteger(handle, Period()); FileWriteInteger(handle, Digits); FileWriteArray(handle, Tmp, 0, 15); return; } void RefreshChart() { int hwnd = WindowHandle(SymbolName, Period()); PostMessageA(hwnd, WM_COMMAND, 33324, 0); return; } string GetComment() { int Spread = (Ask - Bid) / Point + 0.1; double SpreadX = (PriceAsk - PriceBid) / Point; string Str; Str = Symbol() + " spread = " + Spread + "\n" + SymbolName + " spread = " + DoubleToStr(SpreadX, 1); Str = Str + "\nDifference = " + DoubleToStr(Spread - SpreadX, 1); return(Str); } void init() { GetSymbols(); Digits1 = MarketInfo(Symbol1, MODE_DIGITS); Digits2 = MarketInfo(Symbol2, MODE_DIGITS); SymbolChange(); CreateNewBar(); CreateNewSpread(); CreateHandle(); return; } void deinit() { FileClose(handle); Comment(""); return; } void start() { while (!IsStopped()) { if (SymbolChange()) { Comment(GetComment()); if (time < GetLastTime()) { WriteBar(); WriteSpread(); CreateNewBar(); CreateNewSpread(); RefreshChart(); } else { ModifyBar(); ModifySpread(); } } Sleep(PAUSE); RefreshRates(); } return; } BORIS GOLICIN 2014.05.23 08:27 #2517 是否有可能修复一个必须用追踪交易取代正常开仓交易的EA? Vladimir Karputov 2014.05.23 08:38 #2518 ganri: 是否有可能修复一个EA,你想用追踪止损来取代正常的开仓交易? 如果专家顾问是使用MQL向导生成的,那么就很容易了--在创建EA 时,你需要指定需要一个追踪止损,并选择追踪止损的依据是什么。 BORIS GOLICIN 2014.05.23 08:50 #2519 barabashkakvn: 如果专家顾问是使用MQL向导生成的,那就很简单了--在创建EA 时,你需要指定需要一个追踪止损,并选择追踪止损的依据是什么。 该专家顾问是为MT4编写的 igalx 2014.05.24 19:27 #2520 是否可以下载技术分析的图表,--指数S & P 500期货图,TA 25图,以及S & P 500图如果可以的话可以告诉你怎么做,也许有一个解释,如何下载! 我预先感谢你。 1...245246247248249250251252253254255256257258259...1503 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
对吗?
它显示了 错误。做了 一切 工作顺利吗?
不能打开 "C:\Program Files\Alpari Limited MT5 Demo 1\MQL5\include\Expert\Signal\MySignals\ACH_HM_RSI。包括文件 expert_ah_hm_rsi.mq5 14 11
它显示了 错误。做了 一切 工作顺利吗?
不能打开 "C:\Program Files\Alpari Limited MT5 Demo 1\MQL5\include\Expert\Signal\MySignals\ACH_HM_RSI。包括文件 expert_ah_hm_rsi.mq5 14 11
我愿意。
把文件放到指定的文件夹中。
我是。
把文件放到指定的文件夹中。
谢谢你,它正在工作!:)
大家好!
我正在对CrossArbitr指标进行微调。帮助我理解。我需要b(Total)的值在一分钟内(0 bar)加起来s,并与其他指标一起显示在图表上,一分钟后,s的总和被固定,s1=s,开始重新形成。指标s1一个也需要在图表上显示。以下是该指标的代码。
另外,我试图在一个图表上安装Exp-Monitoring-Spread专家顾问--它没有被安装。MT4在日志中写道,这不是一个专家顾问,不能安装。没有检测到编译器中的错误。它以脚本形式运行,但离线图表却不工作。可以做什么?为了以防万一,我们附上了代码。
是否有可能修复一个EA,你想用追踪止损来取代正常的开仓交易?
如果专家顾问是使用MQL向导生成的,那就很简单了--在创建EA 时,你需要指定需要一个追踪止损,并选择追踪止损的依据是什么。
我预先感谢你。