Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
спасибо за ваш ответ, я добавлю вас, когда вернусь домой
Вы правы, была ошибка, на которую мне кто-то указал, и, похоже, она исправлена. вот новая версия. Я также изменил интервал на 1 минуту - но я думаю, что 15-30 минут лучше... это позволит избежать нескольких встречных сделок, когда рынок движется очень быстро.
пожелания,
//+------------------------------------------------------------------+ //| MakeGrid.mq4 | //| Copyright © 2005, hdb | //| http://www.dubois1.net/hdb | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, hdb" #property link "http://www.dubois1.net/hdb" //#property version "1.4beta" extern string GridName = "Grid"; // идентифицирует сетку. позволяет использовать несколько сосуществующих сеток extern double Lots = 0.1; // extern double GridSize = 6; // пункты между ордерами - размер сетки или ячейки extern double GridSteps = 12; // общее количество ордеров для размещения extern double TakeProfit = 6 ; // количество тиков для фиксации прибыли. обычно = размер сетки, но вы можете переопределить extern double StopLoss = 0; // если хотите добавить стоп-лосс. обычные сетки не используют стоп-лоссы extern double UpdateInterval = 1; // обновление ордеров каждые x минут extern bool wantLongs = true; // нужны ли нам длинные позиции extern bool wantShorts = true; // нужны ли нам короткие позиции extern bool wantBreakout = true; // нужны ли нам лонги выше цены, шорты ниже цены extern bool wantCounter = true; // нужны ли нам лонги ниже цены, шорты выше цены extern bool limitEMA34 = false; // хотим ли мы лонги только выше ema, шорты только ниже ema extern double LastUpdate = 0; // счетчик используется для записи времени последнего обновления extern double GridMaxOpen = 0; // максимальное количество открытых позиций //+------------------------------------------------------------------+ //| функция инициализации эксперта | //+------------------------------------------------------------------+ int init() { //---- #property show_inputs // показывает параметры - спасибо Slawa... if ( TakeProfit <= 0 ) // { TakeProfit = GridSize; } //---- return(0); } //+------------------------------------------------------------------------+ //| тестирует наличие открытой позиции или ордера в области atRate | //| проверяет лонги, если checkLongs true, иначе проверяет | //| шорты | //+------------------------------------------------------------------------+ bool IsPosition(double atRate, double inRange, bool checkLongs ) { int totalorders = OrdersTotal(); for(int j=0;j<totalorders;j++) // сканируем все ордера и позиции.... { OrderSelect(j, SELECT_BY_POS); if ( OrderSymbol()==Symbol() && OrderComment() == GridName ) // ищем только если mygrid и символ... { int type = OrderType(); if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // ищем не точную цену, а ценовую близость (меньше размера сетки) { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) ) || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP ) ) ) { return(true); } } } } } } return(false); } //+------------------------------------------------------------------+ //| функция запуска скриптовой программы | //+------------------------------------------------------------------+ int start() { //---- int i, j,k, ticket, entermode, totalorders; bool doit; double point, startrate, traderate; //---- if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // мы обновляем при первом вызове и каждые UpdateInterval минут { LastUpdate = CurTime(); Print("Updating"); point = MarketInfo(Symbol(),MODE_POINT); startrate = ( Ask + point*GridSize/2 ) / point / GridSize; // округляем до числа тиков, кратного GridSize k = startrate ; k = k * GridSize ; startrate = k * point - GridSize*GridSteps/2*point ; // рассчитываем нижнюю точку входа double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0); for( i=0;i<GridSteps;i++) { traderate = startrate + i*point*GridSize; if ( wantLongs && (!limitEMA34 || traderate > EMA34)) { if ( IsPosition(traderate,point*GridSize,true) == false ) // проверяем, нет ли у меня открытых ордеров вблизи моей цены: если да, ставим один { double myStopLoss = 0; if ( StopLoss > 0 ) { myStopLoss = traderate-point*StopLoss ; } if ( traderate > Ask ) { entermode = OP_BUYSTOP; } else { entermode = OP_BUYLIMIT ; } if ( ((traderate > Ask ) && (wantBreakout)) || ((traderate <= Ask ) && (wantCounter)) ) { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,16384,0,Green); } } } } if ( wantShorts && (!limitEMA34 || traderate < EMA34)) { if (IsPosition(traderate,point*GridSize,false)== false ) // проверяем, нет ли у меня открытых ордеров вблизи моей цены: если да, ставим один { myStopLoss = 0; if ( StopLoss > 0 ) { myStopLoss = traderate+point*StopLoss ; } if ( traderate > Bid ) { entermode = OP_SELLLIMIT; } else { entermode = OP_SELLSTOP ; } if ( ((traderate < Bid ) && (wantBreakout)) || ((traderate >= Bid ) && (wantCounter)) ) { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,16384,0,Red); } } } } } } return(0); } //+------------------------------------------------------------------+Да, возможно, вы правы... так что лучше всего было бы обновлять часто, но только несколько слотов сетки? Нужно протестировать. У меня нет твердого мнения.
реакция,
На следующей неделе после моего последнего обновления я был в отпуске, и сетка была остановлена. На прошлой неделе сетка работала большую часть времени.
Я выключал ее несколько раз, когда маржа avail была нулевой, и устанавливал "только лонги" на большинстве мажоров.
Сегодня был день супер возвращения.
Баланс : 93 (+10 с 10 дней назад)
Использованная маржа : +15k
Доступная маржа : +28k
нереал. p&l : -49k (-11 с 10 дней назад)
Баланс : 44k
Чистый баланс на 1к хуже, чем 10 дней назад, и на 5к ниже начального баланса.
Самое сложное во всем этом - попытаться ограничить просадку. Я действительно должен найти способы сделать это!
т.е. знать, когда прекратить добавлять ордера, а когда, как вы сделали, прекратить добавлять, скажем, короткие позиции.
Начал с баланса 100K после неудачного старта, когда использовал слишком большой размер лота и был вынужден закрыть много позиций.
Баланс: 97 594.19 Баланс около 2 недель назад 83k
Свободная маржа: 6 016.88
Плавающий P/L: -38 960.45 было так же плохо, как и -56k
Маржа: 52 616.86
последние пару дней были очень медленными, уровень маржи достигал 93%.
но теперь все мажоры, похоже, начали разворачиваться.
уровень маржи вернулся примерно к 130%
У друга тоже есть один с запущенным стоплоссом... и он изо всех сил пытается удержаться на плаву! Хотя это действительно решает проблему просадки!
Тем временем, я очистил свои позиции - все позиции с сильным отрицательным процентом переноса и хорошо в убытке (несколько 100 пунктов) были закрыты.
Так что мои сетки теперь готовы к очередному удару по голове (маржинальный бакт до 430%)!
Повезло, что мы можем попробовать на демо-счетах!
Теперь, когда я вернулся в "разумное" положение, я настроил все валютные пары следующим образом:
1) торговать только в направлении положительного переноса интереса (если только процент не близок к 0, тогда делать это в обе стороны)
2) лонги только выше 34 ema, шорты только ниже 34 ema
3) для двусторонних валют используйте macd на 5-минутном графике, чтобы решить, лонг или шорт.
Посмотрим, что это даст!
ps. Хотелось бы, чтобы обратное тестирование работало!
Я взял ваш советник на EURUSD, торгую в обе стороны на пробой.
Теперь я хотел бы спросить вас, если вы уже столкнулись со следующей проблемой:
Через некоторое время у меня появляется более одного ордера на некоторые из одних и тех же позиций сетки. Иногда их два, но я также видел 5 и более.
Насколько я понимаю код, на одной позиции сетки одновременно должен быть открыт только один ордер.
Я возился с преобразованием всех двойных значений в int перед сравнением, потому что в MQL2 я обнаружил похожую проблему при сравнении двойных значений.
Вы сталкивались с чем-то подобным?
С уважением,
Кори