Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 7

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Здравствуйте! Я не нашёл темы об обновлении терминала Metatrader 4 для Android 2.3, сильно не пинайте за обращение в этой теме. На маркете терминал только для Android 4+. Где можно обновится мне, а то мой перестал работать.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Не работает терминал mt5 и mt4
Renat Fatkhullin, 2016.11.13 23:51
К сожалению, мы больше не поддерживаем версии Android ниже 4.0.3Там объяснять особо нечего, вот никто и не отвечает. Тот график, который Вы показали - бессмысленный, и как он был получен - загадка.
А имеет смысл опция "Двумерная поверхность" на вкладке "График оптимизации" в тестере тогда (имхо), когда нужно оптимизировать 2 входных параметра советника, или наглядно посмотреть, при каких значениях 2-х параметров на истории были хорошие результаты, взаимозависимы ли эти параметры, и имеют ли они смысл вообще.
У Вас на графике по обеим осям только 0 почему-то, причём по вертикали эти 0 еще на 3 промежуточных шага поделены, поэтому и "кубики одни в центре, вторые ниже/выше, и два/три в одном квадрате". И результаты выглядят случайными - белые и зелёные "кубики" разбросаны случайным образом. Поэтому график бессмысленный и похоже ничего не означает.
График может и бессмыслен, но вот после оптимизации на участке с 2014-2015 и при выборе и установке лучших параметров и повторного тестерования с 2014-по сегодня, результат убыток/просадка остаются неизменны, ну а прибыль растёт пропорционально периоду. Так-же бот проработал на демке месяц, и при тестировании за последний месяц с параметрами по-умолчанию все сделки совпадают с тестером = +-5пп. Не буду значит парится над кубиками и их цветом.
Спасибо за разъяснение.
Я изучаю MQL4 и по этому прошу сильно не пинать за мой вопрос.
Подскажите пожалуйста как правильно рассчитать СЛ и ТП для отложенного ордера, при условии, что он выставляется не от текущей цены, а от цены полученной в ходе вычислений?
Рассчитываться они должны исходя из длинны свечи. Примерно так:
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits);
Спасибо!
Здравствуйте!
Я изучаю MQL4 и по этому прошу сильно не пинать за мой вопрос.
Подскажите пожалуйста как правильно рассчитать СЛ и ТП для отложенного ордера, при условии, что он выставляется не от текущей цены, а от цены полученной в ходе вычислений?
Рассчитываться они должны исходя из длинны свечи. Примерно так:
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits);
Спасибо!
Вот функции, которые рассчитают вам корректные стоп-приказы для любых видов ордеров:
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
{
//---
MqlDateTime server_time;
TimeToStruct(TimeCurrent(),server_time);
//--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
if(server_time.min%minutesBefore==0 || server_time.min==0) {
if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) {
//--- получили сигнал на покупку
Print("Сигнал на покупку ",TimeCurrent()); // Проверочное сообщение в журнал
//--- проверка наличия уже открытой позиции на покупку
if (OrdersTotal() == 0)
{
ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);
Alert ("Есть сигнал на покупку ", sim, per);
}
if (OrdersTotal() >0)
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
if(OrderType()==OP_SELL)
{
OrderClose(ticket, OrderLots(), Bid,0,Blue);
{
ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);
Alert ("Есть сигнал на закрытие продажи и открытие покупки ", sim, per);
}
}
//--- вызов функции открытия позиции на покупку
}
if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) {
//--- получили сигнал на продажу
Print("Сигнал на продажу ",TimeCurrent()); // Проверочное сообщение в журнал
//--- проверка наличия уже открытой позиции на продажу
if (OrdersTotal() == 0)
{
ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
Alert ("Есть сигнал на продажу ", sim, per);
}
if (OrdersTotal() >0)
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
if(OrderType()==OP_BUY)
{
OrderClose(ticket, OrderLots(), Ask,0,Red);
{
ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
Alert ("Есть сигнал на закрытие покупки и открытие продажи ", sim, per);
}
}
//--- вызов функции открытия позиции на продажу
}
}
}
Вот функции, которые рассчитают вам корректные стоп-приказы для любых видов ордеров:
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
Спасибо, Артем! Буду разбираться.
Не за что. Везде, где нужно получить точные цены стоп-приказов, зная цену открытия рыночного или установки отложенного ордера, получайте требуемые цены этими функциями - они вернут уже рассчитанные цены для нужного стоп-приказа.
Допустим, у вас цена установки отложенного ордера:
double priseSet=1.12345;
Тогда цена стоп-лосс
int StopLoss=20; пунктов для BuyLimit будет:
double sl=CorrectStopLoss(Symbol(),OP_BUYLIMIT,priceSet,StopLoss);
Переменная sl примет корректно-рассчитанное значение стоплосс для BuyLimit с учётом требований StopLevel.
Подскажите. Нужно чтобы допустим открыт шорт. При возникновении сигнала на покупку закрывало шорт и открывало лонг.
Проверить есть ли открытая позиция на продажу. Если есть, то закрыть её.
Потом открыть позицию на покупку.
Это же элементарно
Есть огромное желание средствами mql4 реализовать такой вот алгоритм:
Есть два терминала MT4 от разных брокеров. На одном стоит "эксклюзивный" индикатор, который нельзя никак перетащить в другой терминал (по типу как в маркете).
Так вот! Возможно ли как-то брать показания буферов "эксклюзивного" индикатора и реализовать в своем индикаторе на своем терминале?
Ресурсами как-то не получается.