Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Во-первых, действительно, новый билд перестал воспроизводить баг номер 1 - для всех значений индикатора теперь есть сделки.
Во-вторых, по-прежнему, не все сделки совершаются. Я понимаю, что чужой код - потемки, но если можно, посмотрите, мне кажется, ошибка, все-таки у вас. Индикатор дает сигналы. Эксперт просто делает buy / sell по ним, никакой сложной логики. Тем не менее, две трети сигналов игнорируются. Как это проверить: отключаем оптимизацию, ставим параметр (единственный) равным 75, делаем "старт". Затем смотрим на сделки. Параллельно - на бары (+1 или -1) того же индикатора, прикрепленного к тому же окну. Валюта - EURUSD_H1.
Даже если ошибка в моем коде, код этот, или подобный, используется в большинстве систем данного и "дружественных" форумов - я имею в виду не МТС как таковую, а структуру кода. Так что, если Вы поможете найти проблему, это будет полезно не только мне.
С уважением,
Кварк
П.С. На всякий случай, вот последняя версия эксперта, на которой все это можно увидеть. Индикатор и библиотечный файл без изменений. Тестируем по OHLC.
#include "mylib.mq4" extern double dZigzagSize; // ------ datetime timePrev = 0; double dInitAmount = 1000.0; int nNumOfExperts = 5; // To do: autocalculate number of active experts int nSlip = 5; double dProfit = 0; // old: arrTotals double dLotSize = 0.1; double dStopLoss; double dTrailingStop; double dTakeProfit; int nPending = -1; bool bUseMm = false; int nMagic = 0; bool bReportDone = false; bool bBuy = true; bool bSell = true; // ------ int init () { if(Symbol() == "EURUSD" && Period() == 60) { if(!IsTesting()) { dZigzagSize = 75; // buy only? bSell = false; } nMagic = 76; } else if(Symbol() == "GBPCHF" && Period() == 60) { if(!IsTesting()) { dZigzagSize = 235; // buy and sell ? } nMagic = 77; } else if(Symbol() == "GBPUSD" && Period() == 60) { if(!IsTesting()) { dZigzagSize = 75; // buy only? bSell = false; } nMagic = 78; } else if(Symbol() == "USDCAD" && Period() == 60) { if(!IsTesting()) { dZigzagSize = 200; // sell only? bBuy = false; } nMagic = 79; } else if(Symbol() == "USDJPY" && Period() == 60) { if(!IsTesting()) { dZigzagSize = 75; } nMagic = 80; } dStopLoss = dZigzagSize * Point; dTrailingStop = dZigzagSize * Point; dTakeProfit = 0; return(0); } ////////////////// int deinit() { return(0); } //////////////////// int start() { if(AccountFreeMargin() < 500) return(0); Report("Zigzag", nMagic, bReportDone); bool bIsBarEnd = false; if(timePrev != Time[0]) bIsBarEnd = true; timePrev = Time[0]; // ------ int nSignal = iCustom(NULL, 0, "_Zigzag_Ind", dZigzagSize, 0, 1); //Alert(nSignal); dProfit = 0; for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++) { OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY); if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL && OrderSymbol() == Symbol()) { dProfit += OrderProfit(); } } int nNumOfOpenedOrders = 0; for(nCnt = 0; nCnt < OrdersTotal(); nCnt++) { OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == nMagic && OrderSymbol() == Symbol()) { if(OrderType() <= OP_SELL) nNumOfOpenedOrders++; } } if(!nNumOfOpenedOrders) { if(bBuy && (nSignal == -1 || nPending == OP_BUY)) { dLotSize = GetLotSize(); OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss, 0, "Zigzag", nMagic, 0, Aqua); nPending = -1; return(0); } else if(bSell && (nSignal == 1 || nPending == OP_SELL)) { dLotSize = GetLotSize(); OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss, 0, "Zigzag", nMagic, 0, OrangeRed); nPending = -1; return(0); } } else { for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--) { OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == nMagic && OrderSymbol() == Symbol()) { int nMode = OrderType(); if(nMode == OP_BUY && nSignal == 1) { OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); nPending = OP_SELL; return(0); } if(nMode == OP_SELL && nSignal == -1) { OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed); nPending = OP_BUY; return(0); } } } } // ------ for(nCnt = 0; nCnt < OrdersTotal(); nCnt++) { OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == nMagic && OrderSymbol() == Symbol()) { if(OrderType() == OP_BUY && Bid - OrderOpenPrice() > dTrailingStop) { if(OrderStopLoss() < Bid - dTrailingStop) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - dTrailingStop, OrderTakeProfit(), 0, Aqua); return(0); } } if(OrderType() == OP_SELL && OrderOpenPrice() - Ask > dTrailingStop) { if(OrderStopLoss() > Ask + dTrailingStop || OrderStopLoss() == 0) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + dTrailingStop, OrderTakeProfit(), 0, OrangeRed); return(0); } } } } return(0); } // ------ double GetLotSize() { double dLot = (0.1 * dInitAmount + 0.1 * dProfit) / 1000; // To do: what fraction of free margin should be used if(dLot * 2 * dInitAmount > AccountFreeMargin() / nNumOfExperts) dLot = AccountFreeMargin() / (2 * dInitAmount * nNumOfExperts); dLot = MathFloor(dLot * 10) / 10; if(dLot < 0.1) dLot = 0.1; return(dLot); } // ------Проведите, пожалуйста, исследования и опубликуйте техничный (не на глазок) результат.
Уверен, что все обнаружится при Вашем исследовании. Всем будет интересно.
К сожалению, сторонний человек не очень может понять где именно и что пропускается.
Проведите, пожалуйста, исследования и опубликуйте техничный (не на глазок) результат.
Уверен, что все обнаружится при Вашем исследовании. Всем будет интересно.
К сожалению, сторонний человек не очень может понять где именно и что пропускается.
Хорошо. Исследование (с Вашего разрешения, только первые несколько сигналов). Итак.
EURUSD_H1, тестирование по OHLC, начальная дата 15.11.2002, данные с сервера Альпари (у меня там демо счет).
Эксперт приведен в моем последнем посте, индикатор и "библиотека" - в первом посте этой ветки. Если Вам неохота использовать "библиотеку" - закомментируйте вызов функции Report. Результат от этого не изменится.
В "тестере" нажимаем "Expert Properties" и ставим dZigzagSize равным 75. Индикатор - простой зигзаг, при развороте цены на 75 пойнтов он даст сигнал.
Снимаем пометку с "Optimization". Нажимаем на Start. Одновременно (точнее, все-таки, немножко до :) прикрепляем к указанному графику наш индикатор. Таким способом мы сможем смотреть на его сигналы и сличать их со сделками, которые совершает эксперт. Кстати, жаль, что нельзя заставить тестер выставлять значки сделок, как было в вер. 3.
Результаты:
1 2002.12.02 17:00 buy 1 0.10 0.9945 0.9870 0.0000 0.00 0.00
Очень похоже на правду. Сделка совершена на баре, следующем за сигналом.
2 далее следует куча "modify" - пропускаем, они к обсуждению не относятся.
15 2002.12.11 02:00 s/l 1 0.10 1.0058 1.0058 0.0000 109.15 1109.15
16 2002.12.17 18:00 sell 2 0.10 1.0271 1.0346 0.0000 0.00 0.00
Пропущены сигналы:
2002.12.11 02:00 - должен был быть close, сработал s/l. Я не уверен, баг это или нет, так что игнорируем, но имеем в виду.
2002.12.12 10:00 - пропущен buy (сигнал есть на графике индикатора)
2002.12.13 18:00 - пропущен sell
2002.12.16 08:00 - пропущен buy
2002.12.17 17:00 - ну наконец-то, правильный сигнал.
Я не знаю, какой еще анализ надо предоставить, чтобы он был "техничным". Индикатор тупо шлет -1, 0, либо +1. Эксперт их должен также тупо отрабатывать. Он так и делает, но часть (!) пропускает.
Еще раз повторюсь, может быть это моя ошибка. В этом случае я ее просто не вижу. Уже неделю кручу этот эксперт в этом тестере.
Кварк.
Попробуйте еще половить - вставьте отладочный вывод по максимуму.
Просто тупо выводите промежуточные результаты.
А потом: анализ + опубликуйте результат.
Так и оказалось. Спасибо.
Спасибо.
Еще раз повторюсь, может быть это моя ошибка.
Так и оказалось. Спасибо.
В порядке обмена опытом, а где же была ошибка? Всем было бы интересно поучиться на чужих ошибках, чтобы не наступать на те же грабли!