Это как повезёт, может и в оба конца прыгнуть...раздвигаются обе цены или только Аск подпрыгивает?
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Всем привет!
Ребята подскажите пожалуйста.
Я хочу чтобы ордер открывался по условиям. MA1>MA2.
И закрывался по условиям MA1
Пример-
if(kolpos==0)
{
//-покупка
if(MA>MA2 &&Volume[0] if(OrderSend(Symbol(),OP_BUY,iLot,Ask,Slip,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,CLR_NONE)) //а это если условия позволяют то это самма операция по открытию ордера.
return;
}
if(kolpos==1) //-закрытие ордера по условиям
{
if(MA if(OrderClose(OrderTicket(),iLot,Bid,100,Blue))
return;
}
//-
return;
}
Но в журнале при тесте у меня ошибка, как разрулить?
Ошибка 4111 видимо что-то не так в функции OrderClose. пробовал множество вариантов, все глухо.
Весь код если нужен.
//+------------------------------------------------------------------+
//| Простой РСИ.mq4 |
//| BW |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
extern int Magic = 070517; // майджик
extern int SL = 80; // стоплосс
extern int TP = 80; // тайкпрофит
extern int Slip = 3; // проскальзывание
extern double Lot = 0.01; // лот
extern double Martin = 1; // множитель
extern double PerMA = 15; // период МА
extern double PerMA2 = 18; // Период МА2
extern double ModeMA = 2; // Стиль МА
extern double RSIper = 14; // Период РСИ
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits==3 || Digits==5) // пересчитал торговлю для
{
TP*=10; // трехзнака и пятизнака,
SL*=10; // или для более корректной
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//+------------------------------------------------------------------+
//объявление переменных
double iLot =0,
Ordprofit =0,
lott =0,
MA =iMA(Symbol(),PERIOD_CURRENT,PerMA, 0,ModeMA,PRICE_CLOSE,1),
MA2 =iMA(Symbol(),PERIOD_CURRENT,PerMA2,0,ModeMA,PRICE_CLOSE,1),
RSI =iRSI(Symbol(), PERIOD_CURRENT,RSIper,PRICE_CLOSE,0);
if(OrdersHistoryTotal()>0)
{
for(int i=OrdersHistoryTotal(); i>=0; i--) //цикл подсчета ордеров
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue;
if( (OrderType()==OP_SELL || OrderType()==OP_BUY) && OrderSymbol()== Symbol() && OrderMagicNumber() == Magic)
{
Ordprofit=OrderProfit();
lott=OrderLots();
break;
}
}
}
if (Ordprofit>=0)iLot=Lot;//получили прибыль, уменьшили лот
if (Ordprofit//+-------------------------------------------------------------------+ //Объявление переменных Машки итд
//+------------------------------------------------------------------+
int kolpos=0;
for(int pos=0; pos
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) // из всех торговых ордеров, выбрать один. Проверить, а есть ли он вообще.
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) //проверил чей выбранный ордер
kolpos++; //-- и посчитал его
}
}
//+------------------------------------------------------------------+
Comment("\nЛот = ",iLot, "\nTP = ",TP, "\nSL = ",SL); // принт в углу экрана Следующий лот
//+------------------------------------------------------------------+
//функция открытия ордеров
if(kolpos==0)
{
//-покупка
if(MA>MA2 &&Volume[0] if(OrderSend(Symbol(),OP_BUY,iLot,Ask,Slip,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,CLR_NONE)) //а это если условия позволяют то это самма операция по открытию ордера.
return;
}
if(kolpos==1) //-закрытие ордера по условиям
{
if(MA if(OrderClose(OrderTicket(),iLot,Bid,100,Blue))
return;
}
//-
return;
}
//+------------------------------------------------------------------+-------+
А что возвращает Вам OrderTicket() в функции закрытия? если Вы ордер не выбрали?
"Пересечения" средних у Вас на каждом тике срабатывать будут, ибо МА1 > МА2 может пол-дня сохраняться.
Короче: факт пересечения МА устанавливается на 2 барах текущего ТФ, а именно -
if ( MA1[1] > MA2[1] && MA1[2] После срабатывания условия пересечения надо закрывать СЕЛЛ и открывать БАЙ, для другого пересечения - наоборот.
При закрытии ордера делайте цикл по открытым ордерам (например СЕЛЛ) и закрывайте все так:
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),100,Blue);
Интересует правильное написание функции OrderSend() для торговли бинарными опционами.
Брокер: GoMarkets. Для торговли бинарными опционами использует дополнительное ПО для МТ4. Когда нажимаешь в МТ4 открыть новый ордер, то появляется такое окно:
после открытия ордера в комментариях такая запись:
В тех.поддержке GoMarkets сказали, что никаких инструкций не дают по торговле советниками на бинарных опционах, и что торговля советниками на бинарных опционах возможна только на реальных счетах. Вот пытаюсь разобраться если я укажу в функции OrderSend() комментарий для ордера типа "UP/1 h 0 min/70%", сработает ли? И если сработает, то где брать программным путем информацию сколько процентов выплаты "..../70%" по конкретной валютной паре?
Изменено 7 сентября, 2017 пользователем maxstah
Понятно, я думал Вы знакомы с mql...Когда к МА1 добавляю [1] компилятор ругается.
Вам нужно объявить переменные double ma11, ma12, ma21, ma22;
В основном коде отслеживать закрытие свечи, и как свеча закрылась, делать так:
ma12 = ma11; ma11 = iMA(...period1...); // точки ... - то сокращения, в код писать не надо.
ma22 = ma21; ma21 = iMA(...period2...);
А после этого можно писать условия по машкам.
ПС: код, определяющий закрытие свечи найди сам.
Добавлено: 08-09-2017 06:11:19
Сработает! - комментарий запишется, но брокер добавит свой с 70%, а Ваш коммент со 120% брокеру пофигу...если я укажу в функции OrderSend() комментарий для ордера типа "UP/1 h 0 min/70%", сработает ли?
Программно можно читать размер % из коммента с помощью строковых операторов.
Изменено 8 сентября, 2017 пользователем 0ll
Сработает! - комментарий запишется, но брокер добавит свой с 70%, а Ваш коммент со 120% брокеру пофигу...
Программно можно читать размер % из коммента с помощью строковых операторов.
У другого брокера в поддержке подсказали, что в комментариях к ордеру надо добавлять:
"BO exp:900", где 900 - это время истечения ордера в секундах.
Создал скрипт для открытия ордера, сработало.
Такая запись в комментариях сработала для демо счетов NoaFX и GDMFX, других брокеров не проверял.
Господа знающие, подскажите, пожалуйста, как ограничить работу советника по торговым сессиям? Например, чтоб начинал торговать в европейскую и американскую сессию. Какие команды используются?
Хорошо. мы роде про % выплат говорили."BO exp:900", где 900 - это время истечения ордера в секундах.
Свежий урок:
http://tradelikeapro.ru/mql4-analiz-tikovoy-istorii/
Есть некий советник. Прикреплён ниже. Работает он следующим образом:
- Если цена выше машки - открывается покупка. Если ниже - продажа.
- ТП = 200. СЛ = процент средней волатильности за последние 10 свечей.
- Максимум открытых ордеров - только один.
- На каждой свече - максимум один ордер.
- Торговля начинается только с новой свечи (минуя свечу, на которой запустился советник).
(Вышеизложенное описание не являться ключевым. Просто, что бы советник хоть как-то работал.)
В настройках можно указать направление торгов (только бай, либо только селл, либо в оба направления).
Также можно указать, отдельно, для покупок и продаж рассчёт лота.
Если вкл. автоматический расчёт - лот будес расссчитываться, исходя из параматра Risk.
Лот ордеров считается для бай и селл отдельно.
Лот покупок - из функции Lot_b().
Лот продаж - из функции Lot_s().
В настройках можно дать возможность работать системе Парлай (удвоение лота следующего ордера, после прибыльной сделки):
- переключатель вкл\выкл "Parlay".
- максимальное кол-во ордеров в "сетке".
Парлай правильно работает, если разрешить работу только на покупку, либо только на продажу.
Так как, в этом случае работает только одна функция рассчёта лота.
С этим проблем не возникает.
Другой вопрос, если вести торговлю в обе стороны, с режимом Парлай.
Здравый разум даёт мне понять, что суть в том что лот считается для бай и селл отдельно.
Постараюсь на примере объяснить :
(буду рассчитывать пример из фиксированного лота, то есть 0.01.
Включённого Парлая, и Максимальным кол-вом ордеров в сетке равном трём.)
1й ордер - бай (0.01) - убыток. (следующий значит опять с 0.01)
2й ордер - селл (0.01) - прибыль. (следующий ордер - удвоенный.)
3й ордер - бай (0.02) - прибыль. (всё хорошо. прибыль. Значит следующий опять с удвоенным.)
4й ордер - бай (0.04) - прибыль. (третий подряд ордер с удвоенным лотом (0.01-0.02-0.04), значит следующий ордер - только с 0.01)
5й ордер - селл (0.08) - не важно. (но ордер почему-то открылся опять с увеличенным лотом. Так как ордер открылся не бай, а селл.)
6й ордер - бай (0.01) (и вновь всё нормально.)
Ситуация может неоднократно повторяться.
Вопрос: Как реализовать правильный расчёт Парлая, независимо от направления открытия ордеров.
При этом имея возможность отдельно выбирать расчёт лота.
То есть, по прежнему иметь две разных функции для расчёта лота на бай и селл отдельно.
Ситуация не имела бы места, если б я использовал одинаковый стоп для покупок и продаж. Лот бы тогда рассчитывался из одной бы функции.
А так как у меня с разными значениями расчитываеться стоплосс для покупок и продаж - приходиться заниматься подобным головняком, описанном выше.
Львиную долю ошибок уже исправил, а вот правильный расчёт Парлая, с разными значениями стопов - всё никак...
Извиняюсь за тавтологию. Очень сложно письменно перенести суть проблемы.
Как сделать что б индикатор работал только по закрытию свечи?
Типа вот так?
Или там надо prevtime нормализовать?
if(Time[0] == prevtime) return(0);//ждём появления нового бара
prevtime = Time[0];//если появился новый бар , включаемся
prevtime объявлена на глобальном уровне? если нет то её надо объявить как static datetime prevtime;Или там надо prevtime нормализовать?
Здравствуйте, коллеги. Нужна помощь!
В функциях "Lot_b()" и "Lot_s()" упоминалась одна и таже статистическая переменная - "static int c=1".
Поэтому кол-во ордеров в сетке считалось отдельно.
Достаточно было удалить из функций эту переменную и записать её в начале кода во внешний блок.
И тогда обе функции, работающие независимо друг от друга - обращаются к одному счётчику.
Что и влечёт за собой правильную лотность при построение сеточки ордеров.
Лишний раз убедился, что иногда единственным способом нахождения ошибки является
- глубокая ночь, кружка чая, и десятки раз посимвольного перебора кода. :)
prevtime объявлена на глобальном уровне? если нет то её надо объявить как static datetime prevtime;Или там надо prevtime нормализовать?
Да, все верно
static int prevtime = 0; // В глобальных
Но выдает ошибку:
possible loss of data due to type conversion
Из неё индикатор ваще пропадает с графика.
Как это решить?
Вы внимательно читали? я про datetime писал - тогда не будет ошибок конвертации.static int prevtime = 0; // В глобальных
Как заставить терминал подавать звуковой сигнал после закрытия 5ти минутного бара, если цена за этот период касалась уровней, которые нацело делятся на 2.5?
Пробуй Alert(); он издаёт звук и текст выводит.
пусть вместо звукового сигнала будет алерт
Привет! Как я уже писал тебе в личку, закрытие бара можно определить по времени.
В входных параметрах объявляем переменную
datetime new_bar;
if(Time[0]!=new_bar)//новый бар, значит старый секунд назад закрылся что тебе и нужно
{
if(тарам пам пам условие твоего деления)//это может быть функция или что то еще. Если целое число то заходим в скобки если нет то Alert не сработает.
{
Alert();
}
new_bar=Time[0];
}
P.S. я думаю стоит переименовать заголовок темы. Главная проблема это как узнать, что после деления получилось целое число, а не дробное.
Думаю проще будет вписывать уровни в код советника, а тот просто будет оповещать, если этот уровень пересекался предыдущим баром. На первое время и так сойдёт, хоть в голове место освободится. А для деления отдельную тему заведу
Это не проблема: MathMod();Главная проблема это как узнать, что после деления получилось целое число, а не дробное.
Это не проблема: MathMod();
Приветствую!
В математики я полный >D-b
Она выдаёт остаток от деления. Если остаток = 0, то поделилось нацело, например:
if ( MathMod ( 100, 10 ) = 0 ) Alert ( "Поделилось нацело!" ) ;
MathMod ( 102, 10 ) = 2 - это остаток от деления нацело.
Не знаю что имел в виду t11001, если точное касание (не пересечение!), то исследуем Хай и Лоу закрывшейся свечи:
if ( MathMod ( High[1], 2.5 ) = 0 ) Alert ( "коснулось уровня 2.5 хаем!" ) ;
Новый урок:
http://tradelikeapro.ru/testirovanie-na-realnoy-istorii/
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем
