Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
)
так же на всей доступной истори на билде 177 , только на работе.
//+------------------------------------------------------------------+ //| Moving Average.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #define MAGICMA 20050610 //#include <Tracert.mqh> //#include <EquityOscillator.mqh> extern double Lots = 0.1; extern double MaximumRisk = 0.02; extern double DecreaseFactor = 3; extern double MovingPeriod = 12; extern double MovingShift = 6; //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) { if(OrderType()==OP_BUY) buys++; if(OrderType()==OP_SELL) sells++; } } //---- return orders volume if(buys>0) return(buys); else return(-sells); } //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double LotsOptimized() { double lot=Lots; int orders=HistoryTotal(); // history orders total int losses=0; // number of losses orders without a break //---- select lot size lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1); //---- calcuulate number of losses orders without a break if(DecreaseFactor>0) { for(int i=orders-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue; //---- if(OrderProfit()>0) break; if(OrderProfit()<0) losses++; } if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1); } //---- return lot size if(lot<0.1) lot=0.1; return(lot); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { double ma; int res; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //---- sell conditions if(Open[1]>ma && Close[1]<ma) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); return; } //---- buy conditions if(Open[1]<ma && Close[1]>ma) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue); return; } //---- } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { double ma; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue; //---- check order type if(OrderType()==OP_BUY) { if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White); break; } if(OrderType()==OP_SELL) { if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White); break; } } //---- } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { //---- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; //---- calculate open orders by current symbol // Print("OrdersTotal=",OrdersTotal()); // SetTrace(); // WriteEquity(); if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose(); //---- } //+------------------------------------------------------------------+Я еще раз проверил работу стандартного эксперта со вышеуказанными стандартными настройками на EURUSD Daily на предыдущем и новом 177 билдах. При использовании демо-счета с нашего сервера все сходится до цента и до каждой операции (данные с 7 апреля 1989 года).
Полные отчеты выложены тут:
177 билд от 13 июля - https://www.metaquotes.net/en/metatrader5
177 билд от 13 июля - https://www.metaquotes.net/en/metatrader5
Все абсолютно одинаково и это правильно - тестер не менялся. Вот график баланса:
А после подключения к серверу Альпари и полной закачки их данных (тоже начиная с 7 апреля 1989 года) результаты резко поменялись.
Полный отчет по ссылке: https://www.metaquotes.net/en/metatrader5
Почему данные расходятся? Посмотрим на графики (сначала с сервера MetaQuotes, а потом Альпари)
Первая сделка на данных с MetaQuotes была проведена на следующем (18 сентября 1989 г) баре после 15 сентября (красная стрелка указывает на этот бар), где сгенерировался сигнал. Но на данных Альпари этот же фрагмент графика выглядит по-другому:
1) на графике Альпари не достает 2х баров (интересующий нас бар 15 сентября смещен на 2 бара левее)
2) скользящая SMA(12,3) проходит выше цены Close (а на графике MetaQuotes - ниже, что и сгенерировало сигнал)
3) на некоторых барах есть разница в 1 пипс
Недостающие в Альпари бары за 24 августа 1989 (четверг) и 8 сентября 1989 (пятница) дали искаженный график, что повлекло за собой сдвиги и расхождения в генерируемых сигналах...
На всякий случай выкладываю результаты тестирования на работе по данным Альпари:
2 1989.11.08 00:00 close 1 0.20 1.0608 0.0000 0.0000 -118.75 9881.25
Поскипано Ренатом чтобы упростить, содержимое полностью на 100% сходится со стейтментом: https://www.metaquotes.net/en/metatrader5
Специально потратил время чтобы досконально разобраться и представить анализ с понятной и доказательной базой в виде скриншотов.
Похоже, нам надо в отчет добавлять еще один параметр - количество пропущенных/отсутствующих баров в истории + их процентное отношение к существующей истории.
на тиковом графике, который я записал в юзерский файл истории ?
Если да, то как настроить тестер ?
на тиковом графике, который я записал в юзерский файл истории ?
Если да, то как настроить тестер ?
"Юзерский" - это Offline график? Нет, автоматически используются только штатные графики.
Но есть возможность самостоятельно сгенерировать тестовую последовательность баров, которая будет скормлена тестеру.
Статья в разделе: https://www.mql5.com/en/code
Формат файла: "Формат файлов тестера *.FXT"
И что магического в числе 20050610 ?