Очень полезная ссылка - 'Как вставлять код MQL-4 в пост'
//+------------------------------------------------------------------+ //| H4.mq4 | //| Copyright © 2006, MetaQuotes Software Corp. | //| http://wolf002.narod.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, MetaQuotes Software Corp." #property link "http://wolf002.narod.ru" extern double TakeProfit = 77; extern double TakeLost = 44; extern double Lots = 0.1; extern double koef = 0.1; extern double Peryod = 2; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- double razn0, raz, sum; double high_max, low_min, delta_low, delta_high; int ticket,total; total=OrdersTotal(); if(total<1) { // нет ни одного открытого ордера for(int i=1 ;i<Peryod ; i++) { raz=High[i]-Low[i]; sum=sum+raz; } //вычисляем сумму разности Peryod в переменную sum razn0 = High[0]-Low[0]; //вычисляем сумму разности последнего бара sum= sum * koef; double val_High=High[Highest(NULL,0,MODE_HIGH,Peryod,1)]; // находим наивысший предыдущий бар на Peryodе double val_Low=Low[Lowest(NULL,0,MODE_LOW,Peryod,1)]; // находим наинизший предыдущий бар delta_high = High[0]- val_High; if (delta_high < 0) { delta_high = - delta_high; } //пытаемся определить куда дальше движется цена (не уверен, что это правильно) delta_low = val_Low - Low[0]; if (delta_low < 0) { delta_low = - delta_low; } // проверяем на возможность встать в длинную позицию (BUY) if ( razn0 > sum && delta_high > delta_low) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-TakeLost*Point,Ask+TakeProfit*Point,"My order #1",16384,0,Blue); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // проверяем на возможность встать в короткую позицию (SELL) if ( razn0 > sum && delta_high < delta_low) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+TakeLost*Point,Bid-TakeProfit*Point,"My order #1",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } //---- return(0); } //+------------------------------------------------------------------+Да простит меня telnet, взял на себя смелость сделать как написано по ссылке выше (так и правда красивее :) ).
Ну что, система на трендах показывает очень даже не плохие резы.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
//+------------------------------------------------------------------+
//| H4. mq4 |
//| Copyright © 2006, MetaQuotes Software Corp. |
//| http://wolf002.narod.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link "http://wolf002.narod.ru"
extern double TakeProfit = 77;
extern double TakeLost = 44;
extern double Lots = 0.1;
extern double koef = 0.1;
extern double Peryod = 2;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
double razn0, raz, sum;
double high_max, low_min, delta_low, delta_high;
int ticket,total;
total=OrdersTotal();
if(total<1)
{
// нет ни одного открытого ордера
for(int i=1 ;i<Peryod ; i++)
{
raz=High[i]-Low[i];
sum=sum+raz;
}
//вычисляем сумму разности Peryod в переменную sum
razn0 = High[0]-Low[0];
//вычисляем сумму разности последнего бара
sum= sum * koef;
double val_High=High[Highest(NULL,0,MODE_HIGH,Peryod,1)];
// находим наивысший предыдущий бар на Peryodе
double val_Low=Low[Lowest(NULL,0,MODE_LOW,Peryod,1)];
// находим наинизший предыдущий бар
delta_high = High[0]- val_High;
if (delta_high < 0)
{
delta_high = - delta_high;
}
//пытаемся определить куда дальше движется цена (не уверен, что это правильно)
delta_low = val_Low - Low[0];
if (delta_low < 0)
{
delta_low = - delta_low;
}
// проверяем на возможность встать в длинную позицию (BUY)
if ( razn0 > sum && delta_high > delta_low)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-TakeLost*Point, Ask+TakeProfit*Point, "My order #1",16384,0,Blue);
if(ticket>0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
Print("BUY order opened : ", OrderOpenPrice());
}
else Print("Error opening BUY order : ", GetLastError());
return(0);
}
// проверяем на возможность встать в короткую позицию (SELL)
if ( razn0 > sum && delta_high < delta_low)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+TakeLost*Point, Bid-TakeProfit*Point, "My order #1",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
Print("SELL order opened : ", OrderOpenPrice());
}
else Print("Error opening SELL order : ", GetLastError());
return(0);
}
return(0);
}
//----
return(0);
}
//+------------------------------------------------------------------+
Выкладываю свой первый эксперт.
Вообщем первоначальная идея была такова:
Открывать позицию по сигналу текущий бар больше двух предыдущих, т.е. High[0]-Low[0]>(High[1]-Low[1])+(High[2]-Low[2])
Дальше смотрим куда осуществился пробой вниз или вверх для этого High[0] сравниваем с double val_High=High[Highest(NULL,0,MODE_HIGH,Peryod,1)];
дальше если текущий бар идет вверх открываем по направлению
то же только на оборот с селлом.
Потом я добвил выбор кол-ва периодов и коэфициент на который сумма разности High[i]-Low[i] будет перемножаться.
Вообщем при разных входных параметрах получаем различный результат,
Я тестил на дневных периодах.
Инетесно прочитать Ваши коменты.