![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
leonid553 |
![]()
Сообщение
#141
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Понял! И ещё. Обьясни пож. смысл вот этих строк кода (незакоммент):
int start() { //vTerminalRefresh(); //------------------------------------------------------- bool isNewBar=false; if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; } //------------------------------------------------------- //if (isNewBar) { int spread = MarketInfo(Symbol(), MODE_SPREAD); //----- Вывод информации на экран ------------------------------ ---------------------------------------------------------------------------------------- И нужно ли в посл. строке оставить как есть или вместо Symbol(), указать пары? Все работает в тестере. Но вот пока по второй паре результат не соотв. тесту отдельной версии - чуть-чуть. |
NoName |
![]()
Сообщение
#142
|
![]() Группа: Активный участник Сообщений: 514 Регистрация: 1.5.2006 Из: Украина, Кременчуг Пользователь №: 146 Спасибо сказали: 0 раз(а) ![]() |
Код bool isNewBar=false; if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; } Эта конструкция отслеживает появление нового бара. Переменная isNewBar выступает в качестве ключа. true-появился бар, false-бар не появился. Для работы этой конструкции необходимо объявить на глобальном уровне переменную ExpertBars, а в функции Init() присвоить ей значение Bars. Теперь давай проследим работу эксперта. При запуске эксперта первой срабатывает функция Init(), в которой переменной ExpertBars присваивается значение Bars (Bars, возвращает количество баров в терминале). Далее в функции Start() объявляем переменную isNewBar и присваиваем ей false: Код bool isNewBar=false; после чего проверяется условие: Код if (ExpertBars !=Bars) В данный момент переменная ExpertBars хранит значение количества баров, которое было на момент запуска, и в данный момент ExpertBars ==Bars. А не равны они станут только тогда, когда появится новый бар и Bars вернёт значение отличное от ExpertBars. В этот момент выполняются действия {ExpertBars=Bars; isNewBar=true; } ExpertBars получает новое значение баров и замок открывается. На следующем тике замок снова закроется: Код bool isNewBar=false; Далее, что бы то что ты хочешь, выполнялось только по приходу бара нужно поместить в эти скобки: Код if (isNewBar) { } Код int spread = MarketInfo(Symbol(), MODE_SPREAD); Для мультивалютного эксперта символ нужно задать явно. Также нужно предусмотреть несколько таких переменных для каждой пары. |
leonid553 |
![]()
Сообщение
#143
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Благодарю за разъяснение!
|
leonid553 |
![]()
Сообщение
#144
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Ещё вопрос
Код /---- input parameters extern string GBPUSD= "Параметры GBPUSD"; extern int MagicGBP=199; extern bool GBP=True; extern int GBPUSD_period=17; extern int GBP_Env_period=20; extern int GBP_Env_shift=1; extern double GBP_Env_deviation=17; extern int sl_GBPUSD = 54; extern int tp_GBPUSD = 50; extern string _Parameters_Trailing_GBP = "- Параметры Трейлинга GBPUSD -"; extern bool UseTrailing = false;// Использовать трейлинг extern bool ProfitTrailing = false;//Включать трейлинг когда получен профит extern int TrailingStop = 10; // Фиксированный размер трала extern int TrailingStep = 5; // Шаг трейлинга //******************************************************************** extern string USDCHF= "Параметры USDCHF"; extern int MagicCHF=991; extern bool CHF=false; extern int USDCHF_period=5; extern int CHF_Env_period=25; extern int CHF_Env_shift=1; extern double CHF_Env_deviation=20; extern int sl_USDCHF = 53; extern int tp_USDCHF = 30; extern string _Parameters_Trailing_CHF = "-- Параметры Трейлинга USDCHF--"; extern bool UseTrailing_ = false;// Использовать трейлинг extern bool ProfitTrailing_ = false;//Включать трейлинг когда получен профит extern int TrailingStop_ = 10; // Фиксированный размер трала extern int TrailingStep_ = 5; // Шаг трейлинга color clModifyBuy = Green; color clModifySell = Blue; color clModifyBuy_ = Green; color clModifySell_ = Blue; //-- Подключаемые модули --------------- #include <stdlib.mqh> #include <b-Lots.mqh> //Переменный лот //#include <VisualTestingTools.mq4> //визуализация //-------------------------------------- static int prevtime = 0; static int spread = 3; //-- int ExpertBars; Это был блок внешних параметров. Далее непонятно - куда воткнуть строку для каждой пары int spread = MarketInfo(Symbol(), MODE_SPREAD); Код nt start() { int spread = MarketInfo(Symbol(), MODE_SPREAD); double Stochastic_array[49]; //------заполняем массив значениями Stochastic GBPUSD ----------- int i=0; while (i<50) { Stochastic_array[i]=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,i); i++; } //------------------------------------------------------ ArraySetAsSeries(Stochastic_array,true); //-------Цепляем конверт на Стохастик -------------- double En0_low=iEnvelopesOnArray(Stochastic_array,0, GBP_Env_period,0, GBP_Env_shift,GBP_Env_deviation,MODE_LOWER,0); double En0_up=iEnvelopesOnArray(Stochastic_array,0, GBP_Env_period,0, GBP_Env_shift,GBP_Env_deviation,MODE_UPPER,0); double Stochastic_0=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,0); double Stochastic_1=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,1); //************* то же самое для USDCHF **************************** double Stochastic_array_[49]; |
NoName |
![]()
Сообщение
#145
|
![]() Группа: Активный участник Сообщений: 514 Регистрация: 1.5.2006 Из: Украина, Кременчуг Пользователь №: 146 Спасибо сказали: 0 раз(а) ![]() |
А у тебя вообще переменная Spread где-то используется ?
Строка должна быть в функции Start(), а где именно принципиальной разницы нет, главное что бы она была до того места где ты будешь её использовать ![]() Выглядеть это будет примерно так: Код int GBPspread = MarketInfo("GBPUSD", MODE_SPREAD); int CHFspread = MarketInfo("USDCHF", MODE_SPREAD); Вот только никак не пойму где ты спрэд используешь в этом советнике ?? |
leonid553 |
![]()
Сообщение
#146
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Я тогда её вот в эти блоки вставлю - хуже не будет (кашу маслом не ...)
Код //============================= GBPUSD ================================== if (GBP) { //если ордеров по паре GBPUSD нет и "выключатель" включен if (!ExpertOrder(MagicGBP)) { //-------Проверяем условие на покупку------------- if ( (Stochastic_1<En0_low) && (Stochastic_0>En0_low) ) { //---- Цикл открытия ордера ------------------------------------------- int Cnt=1; while (Cnt <= 5) { //-----покупаем-------------- Lots=GetSizeLot(); if (OrderSend("GBPUSD", OP_BUY, Lots, Ask, 3, Bid - sl_GBPUSD * Point, Ask+tp_GBPUSD* Point,"General", MagicGBP, 0, Blue) > 0) break; else { Print ("Ошибка открытия Buy #", ErrorDescription( GetLastError() ), " попытка ", Cnt); if (Cnt==5) return(0); //если за 5 попыток не закрыли - выходим Cnt++; Sleep(15000); // ждём 15 секунд А по символу - в тралах там есть - ссылка на символ. И как тут? Оставить как есть? - Код //// TRAILING STOP 2 // ////////////////////////////////////////////////////////////////////////////// if (UseTrailing_ == True) { bool fm_; int err_; double ldOpen_=0; double ldTake_=0; for (int r=0; r<OrdersTotal(); r++) { if (OrderSelect(r, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicCHF) { if (OrderType()==OP_BUY) { if (!ProfitTrailing_ || (Bid-OrderOpenPrice())>TrailingStop_*Point) { if (OrderStopLoss()<Bid-(TrailingStop_+TrailingStep_-1)*Point) { //ModifyStopLoss(Bid-TrailingStop*Point, clModifyBuy); ldOpen_=OrderOpenPrice(); ldTake_=OrderTakeProfit(); if (IsTradeAllowed()) { fm_=OrderModify(OrderTicket(),ldOpen_,Bid-TrailingStop_*Point,ldTake_,0,clModifyBuy_); if (!fm_) { err_=GetLastError(); Print("Error(",err_,") modifying SL: "); } } } } } if (OrderType()==OP_SELL) { if (!ProfitTrailing_ || OrderOpenPrice()-Ask>TrailingStop_*Point) { if (OrderStopLoss()>Ask+(TrailingStop_+TrailingStep_-1)*Point || OrderStopLoss()==0) { //ModifyStopLoss(Ask+TrailingStop*Point, clModifySell); ldOpen_=OrderOpenPrice(); ldTake_=OrderTakeProfit(); if (IsTradeAllowed()) { fm_=OrderModify(OrderTicket(),ldOpen_,Ask+TrailingStop_*Point,ldTake_,0,clModifySell_); if (!fm_) { err_=GetLastError(); Print("Error(",err_,") modifying SL: "); } } } } } } } } } ///////////////////////////////////////////////////////////////////////////////// ////// end of TRAILING STOP 2 //// |
NoName |
![]()
Сообщение
#147
|
![]() Группа: Активный участник Сообщений: 514 Регистрация: 1.5.2006 Из: Украина, Кременчуг Пользователь №: 146 Спасибо сказали: 0 раз(а) ![]() |
Нет, как есть нельзя оставлять. Тралить не будет вторую пару. Вместо Period(), нужно прописать конкретную пару.
|
leonid553 |
![]()
Сообщение
#148
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Ок! Вставил вместо Symbol() в тралах - названия пар.
Теперь вот вроде заметил глюк при торговле. Причем в изначальной отдельной версии. Но сначала вот что : --------------------------------------------------------- ------Проверяем условие на покупку------------- if ( (Stochastic_1<En0_low) && (Stochastic_0>En0_low) ) ---------------------------------------------------------- Но при этом у нас получается - что СТохастик просто перепрыгивает через границу конверта! - НА ДВУХ ПОСЛ. ТИКАХ! но так бывает далеко не всегда. Ведь сначала будет ---------------------------------------------------------- (Stochastic_1<En0_low) && (Stochastic_0=En0_low) потом станет - (Stochastic_1=En0_low) && (Stochastic_0>En0_low) ) ------------------------------------------------------------------ А условие кот. выше - может и так и не наступить!Как ты думаешь, - нет ли здесь у нас некоторой непродуманности условий на вход? |
NoName |
![]()
Сообщение
#149
|
![]() Группа: Активный участник Сообщений: 514 Регистрация: 1.5.2006 Из: Украина, Кременчуг Пользователь №: 146 Спасибо сказали: 0 раз(а) ![]() |
Цитата Но при этом у нас получается - что СТохастик просто перепрыгивает через границу конверта! - НА ДВУХ ПОСЛ. ТИКАХ! Не на ТИКАХ, а на барах. Думаю что с условием всё впорядке, т.к. по стратегии нужно входить по пробою границы конверта. А пробой мы можем идентифицировать только так: на предыдущем баре стохастик ниже границы, на текущем он уже выше границы. И почему это условие у нас может не наступить? Как по мне, так выполнение условия (Stochastic_0 == En0_low) весьма сомнительно, так как эти индикаторы дают значение с точностью до 4-го знака после запятой. И вероятность того что в какой то момент времени они станут равны, думаю, очень-очень мала. |
leonid553 |
![]()
Сообщение
#150
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Как это, - " не на тиках а на барах" ?
Советник работает по тикам! , - не по ценам открытия! Условие if (isNewBar) { } я убрал! Код En0_low=iEnvelopesOnArray(Stochastic_array,0, GBP_Env_period,0, GBP_Env_shift,GBP_Env_deviation,MODE_LOWER,0); double En0_up=iEnvelopesOnArray(Stochastic_array,0, GBP_Env_period,0, GBP_Env_shift,GBP_Env_deviation,MODE_UPPER,0); double Stochastic_0=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,0); double Stochastic_1=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,1); "Как по мне, так выполнение условия (Stochastic_0 == En0_low) весьма сомнительно, так как эти индикаторы дают значение с точностью до 4-го знака после запятой. И вероятность того что в какой то момент времени они станут равны, думаю, очень-очень мала." ну, впрочем, с этим понятно! Гороздо больше беспокоит другое! Отслеживал в визуальном режиме одиночную версию и вроде обнаружил глюк, - разумеется,, не в нашу пользу! Но сначала проясни вопрос " по барам или по тикам"? |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 4.8.2025, 11:36 |