Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 623
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я же уже описал простейшую задачу.
Открываем редактор MetaEditor.
Нажимаем кнопочку Файл->Создать.
В выпрыгивающем поле выбираем Индикатор.
...
Но подобный код транслятор MQL не воспринимает никак.
Примерно через 20 минут отвечу
Что Вы как дети, в самом деле, воду баламутите?
Да никто ничего не баламутит. Вот наконец-то немного ситуация начала проясняться. Вы оказывается скриптом называете функцию которую в теле основного кода размещать нельзя.
Ещё не следует забывать, что МТ предназначен для работы с деньгами которые надо защищать от посягательств третьих лиц. Отсюда большинство ограничений языка.
Я же уже описал простейшую задачу.
Открываем редактор MetaEditor.
Нажимаем кнопочку Файл->Создать.
В выпрыгивающем поле выбираем Индикатор.
И в поле индикатора OnCalculate() внедряем любой скриптовый объект с событием OnStart().
Лично я не знаю, как это сделать. Ну, например так:
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
for(int i = 1; i < 100;i++)
{
if(open[i] > Max)
{
OnStart()
И здесь пишем скрипт построения интересующего нас объекта. Например, эллипса, или буквы на графике, или еще чего-нибудь
} //if(open)
} //for(int i)
//--- return value of prev_calculated for next call
return(rates_total);
} // OnCalculate
Как-то так, наверное, это должно выглядеть.
Но подобный код транслятор MQL не воспринимает никак.
Это должно выглядеть примерно так
Примерно через 20 минут отвечу
Долго загружалось видео - более 40 минут.
Долго загружалось видео - более 40 минут.
Я тоже иногда путаю разделы форума и на вопрос по mql4 пишу ответ на mql5.
В принципе, в этом случае ничего не изменится кроме расширения файла, но в mql4 будет лишним
и даже абсолютно ненужным и бесполезным.
Что Вы как дети, в самом деле, воду баламутите?
Просто зайдите в редактор MetaEditor, и наберите команду: Файл->Создать...
В результате выскочит форма с разными болванками.
В частности это будут болванки:
- Советник
- Пользовательский индикатор
- Скрипт
- Библиотека и т.д.
Нас интересуют первые три пункта: Советник, Пользовательский индикатор и Скрипт.
Сравниваем эти болванки:
в советнике мы имеем события:
-OnInit(), OnDeinit(), OnTick(), OnTimer, OnChartEvent() … все, больше нет.
в скрипте мы имеем события:
- OnStart() … все, больше нет.
в индикаторе мы имеем события:
- OnInit(), OnCalculate(), OnTimer, OnChartEvent() … все, больше нет.
Здесь вполне естественным является вопрос о том, каким образом осуществлять связь между этими объектами.
Выясняется, что никакой связи в MQL между ними нет и быть не может, поскольку потоки данных между этими объектами полностью разделены, и никакой связи между ними нет.
Более того, меня удивляет тот факт, что создатели MQL выдают этот факт нам как "благо".
И если, например, в рамках С++ я могу спокойно вызвать транслятор Бэйсика, или JavaSсript, или любой другой, и перейти, например, в среду программирования Android,
то в рамках MQL у меня нет возможности даже создать так называемый "скрипт" в среде "индикатора", поскольку среда индикатора не воспринимает команду OnStart().
Это что за уродство ???
И таких уродств в MQL более чем достаточно.
Они на каждом шагу.
Я читаю описание MQL - и удивляюсь, поскольку больше ничего не остается делать.
И при этом создатели MQL громогласно заявляют, что MQL является наследником С++.
Я извиняюсь, конечно, но хотелось бы спросить у создателей MQL: - Наследником в чем? - В уродствах?
Я невольно сравниваю MQL с известной средой программирования 1С. Они тоже утверждают, что являются наследниками С++
Но там все сделано гораздо более прилично.
И графические объекты, и связь между модулями и многое другое.
А в MQL что?
Ни встроенных классов, ни объектов, связанных с потоком, … и вообще ничего.
И это я еще ничего не сказал о математической оболочке терминала!!!
Это вообще отдельная тема для удивлений!!!
Давайте вы немного всё-таки почитаете справку, найдёте в ней всё то, чего вы говорите, что нету, почитаете о встроенных классах в СБ, подучитесь вежливо просить помощи (вы же за помощью обратились), научитесь не хамить людям, пытающимся вам помочь (заметьте - бескорыстно)...
В общем - бан на сутки вам за троллинг, хамство и попрошайничество (вы не показали ни строчки своего кода чтобы доказать все ваши заявления, но безапелляционно требуете от людей, откликнувшихся на ваш вопрос и заявления, чтобы они предоставили вам рабочий код для ваших нужд - тут так не заведено - тут помогают, а не делают за вас, замечу - простейший код)
Без обид - кто к нам с ничем придёт, тот от не пойми чего и погибнет
Тем более, что я вас предупреждал поубавить накал:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Artyom Trishkin, 2018.09.12 14:02
Теперь попробуйте без оскорблений и высокомерия.как установить МТ4 на МакОС? помогите плиз!
Исключительно в виртуалке. У меня стоит параллелс дорого но удобно и надёжно.
https://www.parallels.com/ru/products/desktop/
Прошу помощи. Вопросы такие:
1. Программа не выставляет стоп лоссы ни на бай, ни на селл в режиме теста. Но модификация ордеров по отложенным проходит.
2. Не запускается на счёте в реальном времени.
Помогите пожалуйста.
И прошу указать на все ошибки, допущенные при написании программы.
За ранее спасибо.
Код программы:
.input int Percent=50;
input int MAGICNUMBER=413;
//Параметры констант индикаторов и осциляторов для долгосрочных графиков
input int Signal_Period_long_term=6;
input int Fast_EMA_Period_long_term=12;
input int Slow_EMA_Period_long_term=24;
//Параметры констант индикаторов и осциляторов для краткосрочных графиков
input int Stochastic_Kperiod_short_term=5;
input int Stochastic_Dperiod_short_term=3;
input int Stochastic_slowing_short_term=3;
input ENUM_TIMEFRAMES PERIODs_short_term=PERIOD_M5;
input ENUM_TIMEFRAMES PERIODs_long_term=PERIOD_H1;
//-----------------------------------------------------------------------------------------
//Общие переменные и их типы
static datetime New_Time;// Время текущего бара
static datetime Time_Local;
double Margin_Percent; //Используемые средства для открытия ордеров
double Lots;//Определение общего количества лотов
double Lots_Volume;
//Переменные и типы для долгосрочного графика
double MacdCurrent_long_term;//Параметры MACD основной линии текущего бара
double MacdPrevious_long_term;//Параметры MACD основной линии предыдущего бара
double SignalCurrent_long_term;
//Переменные и типы для краткосрочного графика
double Stochastic_Current_short_term_main;//Параметры Stochastic текущего бара на 5-тиминутном графике
double Stochastic_Previous_short_term_main;//Параметры Stochastic предыдущего бара на 5-тиминутном графике
double Stochastic_Current_short_term_signal;//Параметры Stochastic текущего бара на 5-тиминутном графике
double Stochastic_Previous_short_term_signal;//Параметры Stochastic предыдущего бара на 5-тиминутном графике
double StopLoss_BUY;
double StopLoss_SELL;
double Price_BUY;
double Price_SELL;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int ticket,cnt;
int total=OrdersTotal();// Опредление количства ордеров
bool New_Bar=false; // Флаг нового бара
//Определение значений переменных для долгосрочного графика
MacdCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,1);
MacdPrevious_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,2);
SignalCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_SIGNAL,1);
//Определение значений переменных для краткосрочного графика
Stochastic_Current_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,1);
Stochastic_Previous_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,2);
Stochastic_Current_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,1);
Stochastic_Previous_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,2);
//Определение общих переменных
Price_BUY=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
Price_SELL=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
StopLoss_BUY=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
StopLoss_SELL=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
Margin_Percent=AccountFreeMargin()*Percent/100;
Lots=NormalizeDouble(Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);
Lots_Volume=NormalizeDouble(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP),2);
//-----------------------------------------------------------------------------------------------------------------------
//----- Определение нового бара------------------------------------------------------------------------------------------
New_Time=TimeCurrent();
Print("Время =",TimeCurrent());
Print("Время открытия бара =",iTime(NULL,PERIODs_short_term,0));
if(iTime(NULL,PERIODs_short_term,0)==New_Time) // Сравниваем время
{
if(iVolume(NULL,PERIODs_short_term,0)<=2) //Сравниваем объём
Print("Объём бара =",Volume[0]);
if(iBarShift(NULL,PERIODs_short_term,TimeCurrent())==0)//Проверка индекса бара
Print("Номер бара =",iBarShift(NULL,PERIODs_short_term,TimeCurrent()));
New_Bar=true; // Поймался новый бар
Print("Новый бар");
}
else if(New_Bar==false) // Если бар не новый..
{
Print("Бар не новый");
return;
}
//---Проверка на наличие денежных средств для открытия минимального лота
if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT)))
{
Print("Не хватает средств. Свободные средства = ",AccountFreeMargin());
return;
}
//---Определение количества лотов
if(Lots>Lots_Volume)
{
Lots=NormalizeDouble(Lots_Volume,2);
Print("Количество лотов : ",Lots);
}
else if(Lots<Lots_Volume)
{
Lots=NormalizeDouble(MathFloor(Lots),2);
Print("Количество лотов : ",Lots);
}
//+------------------------------------------------------------------+
//| Условия открытия одеров при количестве ордеров равных нулю |
//+------------------------------------------------------------------+
if(total<1)
{
if(MacdCurrent_long_term<0 && MacdCurrent_long_term>SignalCurrent_long_term)
Print("Условие верно для BUY");
{
//+---------------------------------------------------------------------------+
//| Условие для открытия только длинных позиций BUY |
//+---------------------------------------------------------------------------+
if(Stochastic_Current_short_term_main<Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main>=Stochastic_Previous_short_term_signal)
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price_BUY,3,0,0,NULL,MAGICNUMBER,0,Blue);
if(ticket>0)//проверка отрытия позиции
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("BUY ордер открыт : ",OrderOpenPrice());
return;
}
else Print("Ошибка открытия ордера BUY : ",GetLastError());
return;
}
}
}
if(MacdCurrent_long_term>0 && MacdCurrent_long_term<SignalCurrent_long_term)
Print("Условие верно для SELL");
{
//+---------------------------------------------------------------------------+
//| Условие для открытия только коротких позиций SELL |
//+---------------------------------------------------------------------------+
if(Stochastic_Current_short_term_main>Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main<=Stochastic_Previous_short_term_signal)
{
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Price_SELL,3,0,0,NULL,MAGICNUMBER,0,Green);
if(ticket>0)//проверка отрытия позиции
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("SELL ордер открыт : ",OrderOpenPrice());
return;
}
else Print("Ошибка открытия ордера SELL : ",GetLastError());
return;
}
}
}
}
//+---------------------------------------------------------------------------+
//| Условия модификации ордеров |
//+---------------------------------------------------------------------------+
for(cnt=0;cnt<total;cnt++)
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderMagicNumber()==MAGICNUMBER && // проверка магического номера ордера
OrderSymbol()==Symbol()) // проверка символа ордера
{
//--- длинная позиция открыта
if(OrderType()==OP_BUYSTOP)
{
if(OrderOpenPrice()<Price_BUY && Ask<Price_BUY)
{
if(OrderModify(OrderTicket(),Price_BUY,0,0,0,Blue))
Print("Цена Price_BUY ордера успешно модифицирована.");
else Print("Ошибка модификации ордера BUYStop. Код ошибки=",GetLastError());
return;
}
else Print("Цена модификации выше цены ордера");
return;
}
if(OrderType()==OP_SELLSTOP)
{
if(OrderOpenPrice()<Price_SELL && Bid>Price_SELL)
{
if(OrderModify(OrderTicket(),Price_SELL,0,0,0,Green))
Print("Цена Price_SELL ордера успешно модифицирована.");
else Print("Ошибка модификации ордера SELLStop. Код ошибки=",GetLastError());
return;
}
}
if(OrderType()==OP_BUY)
{
if(OrderStopLoss()<StopLoss_BUY && StopLoss_BUY<Ask)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_BUY,0,0,Blue))
Print("Цена Price_BUY ордера успешно модифицирована.");
else Print("Ошибка модификации ордера BUY. Код ошибки=",GetLastError());
return;
}
}
if(OrderType()==OP_SELL)
{
if(OrderStopLoss()>StopLoss_SELL && StopLoss_SELL>Bid)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))
Print("Цена Price_SELL ордера успешно модифицирована.");
else Print("Ошибка модификации ордера SELL. Код ошибки=",GetLastError());
return;
}
}
}
}
}
//+------------------------------------------------------------------+
Помогите исправить ошибку в индикаторе, не рисует максимум и минимум дня когда он на последней свече часа.
https://prnt.sc/kut6xo
https://prnt.sc/kut79b
Прошу помощи. Вопросы такие:
1. Программа не выставляет стоп лоссы ни на бай, ни на селл в режиме теста. Но модификация ордеров по отложенным проходит.
2. Не запускается на счёте в реальном времени.
Вот так
будет модифицировать И код, вставляйте корректно (Alt+S).