![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
да верно
Если я на правильном пути то я должен добавить еще одну функцию:
{
OrderSend ()
}
опять же при условии что будут открываться только ордера на покупку... А ордер на продажу будет предварительно открыт вручную перед запуском советника...
я понимаю что моя функция состоит из нескольких функций, вначале я должен подсчитать ордера на продажу, потом ордера на покупку, и если чего-то окажется меньше чем в моем условии тогда будут открываться ордера либо на покупку либо на продажу. Если я правильно понимаю значение функции CountTrades (), то она отвечает за общее количество открытых в данный момент ордеров как Buy так и Sell ордеров, а мне нужно отдельно для Buy и отдельно для Sell ордеров
предположу что для ордеров на покупку это будет выглядеть примерно так:
{
int count =0; // обнуляем переменную
for(int i = OrdersTotal() - 1; i <= 0; i++) // перебор открытых и отложеных ордеров
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true) // если получилось выбрать ордер
{
if(OrderSymbol() == Symbol() && OrderType() == otype && OrderMagicNumber() == Magic) // проверяем наш ли ордер
{
count++; // плюсуем наши ордера
}
}
}
return(count);
}
а для ордеров на продажу вот так:
Если я на правильном пути то я должен добавить еще одну функцию:
{
OrderSend ()
}
опять же при условии что будут открываться только ордера на покупку... А ордер на продажу будет предварительно открыт вручную перед запуском советника...
я понимаю что моя функция состоит из нескольких функций, вначале я должен подсчитать ордера на продажу, потом ордера на покупку, и если чего-то окажется меньше чем в моем условии тогда будут открываться ордера либо на покупку либо на продажу. Если я правильно понимаю значение функции CountTrades (), то она отвечает за общее количество открытых в данный момент ордеров как Buy так и Sell ордеров, а мне нужно отдельно для Buy и отдельно для Sell ордеров
Передавайте в функцию при запросе тип нужного ордера.
CountTrades(OP_SELL)
Передавайте в функцию при запросе тип нужного ордера.
CountTrades(OP_SELL)
{
OrderSend (на покупку)
}
if (CountTrades(OP_SELL)< 1 )
{
OrderSend (на продажу)
}
а полностью будет выглядеть так:
//*************************************************************
//-----------------------глобальные переменные------------------------------------
extern int Magic =123;
extern
extern
extern
//**************************************************************
void OnTick()
{
//-----------------------функция ордеров на покупку------------------------------------
if (CountTrades(OP_BUY)< 10 )
{
OrderSend (на покупку)
return (0);
}
//---------------------------------------------------------
//-----------------------функция ордеров на продажу------------------------------------
if (CountTrades(OP_SELL)< 1 )
{
OrderSend (на продажу)
}
return (0);
//---------------------------------------------------------
}
//***************************************************************
//-----------------------функция подсчета ордеров------------------------------------
int CountTrades(int otype,)
{
int count =0; // обнуляем переменную
for(int i = OrdersTotal() - 1; i >= 0; i--) // перебор открытых и отложеных ордеров
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true) // если получилось выбрать ордер
{
if(OrderSymbol() == Symbol() && OrderType() == otype && OrderMagicNumber() == Magic) // проверяем наш ли ордер
{
count++; // плюсуем наши ордера
}
}
}
return(count);
}
//---------------------------------------------------------
Пытаюсь написать первый советник, необходимо написать функцию, условие такое:
Если ордеров на продажу равно 1, а ордеров на покупку меньше 10 ,
то выставляем один стоповый ордер (buy limit) на покупку на (n- пунктов от реальной цены)
Вы писали что открываете ордер на продажу вручную, тогда ваше условие будет выглядеть так
int CountTrades(
int otype=-1,// торговая операция, если -1 любая торговая операция
int magic=-1 // идентификатор, если -1 то любой идентификатор
)
{
int count=0; // обнуляем переменную
for(int i=OrdersTotal()-1; i>=0; i--) // перебор открытых и отложеных ордеров
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) // если получилось выбрать ордер
{
if(OrderSymbol()==Symbol()) // проверяем наш ли ордер
{
if(OrderType()==otype || otype==-1)
{
if(OrderMagicNumber()==magic || magic==-1)
{
count++; // плюсуем наши ордера
}
}
}
}
}
return(count);
}
//+------------------------------------------------------------------+
if(CountTrades(OP_SELL,0)==1 && CountTrades(OP_BUY,Magic)<10)
{
int ticket=OrderSend(OP_BUYSTOP);
}
//+------------------------------------------------------------------+
...
Вы писали что открываете ордер на продажу вручную, тогда ваше условие будет выглядеть так
//-----------------------функция подсчета ордеров------------------------------------
int CountTrades(
int otype=-1,// торговая операция, если -1 любая торговая операция
int magic=-1 // идентификатор, если -1 то любой идентификатор
)
{
int count=0; // обнуляем переменную
for(int i=OrdersTotal()-1; i>=0; i--) // перебор открытых и отложеных ордеров
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) // если получилось выбрать ордер
{
if(OrderSymbol()==Symbol()) // проверяем наш ли ордер
{
if(OrderType()==otype || otype==-1)
{
if(OrderMagicNumber()==magic || magic==-1)
{
count++; // плюсуем наши ордера
}
}
}
}
}
return(count);
}
//+------------------------------------------------------------------+
if(CountTrades(OP_SELL,0)==1 && CountTrades(OP_BUY,Magic)<10)
{
int ticket=OrderSend(OP_BUYSTOP);
}
//+------------------------------------------------------------------+
Я совсем запутался...int ticket=OrderSend(OP_BUYSTOP); в этой строчке вместо OP_BUYSTOP я должен прописать все условия для открытия ордера?
и второе, если я правильно понимаю код, то для ордера на продажу советником код дальше должен выглядеть так:
{
int ticket=OrderSend(OP_SELLSTOP)
}
могу ли я написать условия и на покупку и на продажу одновременно:
{
int ticket=OrderSend(OP_BUYSTOP)
int ticket=OrderSend(OP_SELLSTOP)
}
?
//| Tester1.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//********************************************************************
// Глобальные переменные
//********************************************************************
extern int Takeprofit = 5;
extern int Magic = 123;
extern double Lots = 0.01;
//*******************************************************************
double TP;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(CountTrades(OP_SELL,Magic)==0 && CountTrades(OP_BUY,Magic)<10)
{
TP = NormalizeDouble ( Ask+15*Point,4);
ticket=OrderSend ( Symbol (), OP_BUYLIMIT, Lots, Ask, 0, 0, TP, NULL, Magic, 0, Blue);
if ( ticket < 0)
Print ( "Не удалось выставить ордер BUYLIMIT");
}
if(CountTrades(OP_SELL,Magic)<1 && CountTrades(OP_BUY,Magic)<10)
{
TP = NormalizeDouble ( Bid-15*Point,4);
ticket=OrderSend ( Symbol (), OP_SELLSTOP, Lots, Bid, 0, 0, TP, NULL, Magic, 0, Red);
if ( ticket < 0)
Print ( "Не удалось выставить ордер SELLSTOP");
}
}
//********************************************************************
// ФУНКЦИИ
//********************************************************************
//-----------------------функция подсчета ордеров------------------------------------
int CountTrades(
int otype=-1,// торговая операция, если -1 любая торговая операция
int magic=-1 // идентификатор, если -1 то любой идентификатор
)
{
int count=0; // обнуляем переменную
for(int i=OrdersTotal()-1; i>=0; i--) // перебор открытых и отложеных ордеров
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) // если получилось выбрать ордер
{
if(OrderSymbol()==Symbol()) // проверяем наш ли ордер
{
if(OrderType()==otype || otype==-1)
{
if(OrderMagicNumber()==magic || magic==-1)
{
count++; // плюсуем наши ордера
}
}
}
}
}
return(count);
}
//+------------------------------------------------------------------+
попробовал запустить на Демосчете, то что у меня получилось пока без стоплосса. При компиляции ошибок не выдает, но и торговать не хочет...
//| Tester1.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//********************************************************************
// Глобальные переменные
//********************************************************************
extern int Takeprofit = 5;
extern int Magic = 123;
extern double Lots = 0.01;
//*******************************************************************
double TP;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(CountTrades(OP_SELL,Magic)==0 && CountTrades(OP_BUY,Magic)<10)
{
TP = NormalizeDouble ( Ask+15*Point,4);
ticket=OrderSend ( Symbol (), OP_BUYLIMIT, Lots, Ask, 0, 0, TP, NULL, Magic, 0, Blue);
if ( ticket < 0)
Print ( "Не удалось выставить ордер BUYLIMIT");
}
if(CountTrades(OP_SELL,Magic)<1 && CountTrades(OP_BUY,Magic)<10)
{
TP = NormalizeDouble ( Bid-15*Point,4);
ticket=OrderSend ( Symbol (), OP_SELLSTOP, Lots, Bid, 0, 0, TP, NULL, Magic, 0, Red);
if ( ticket < 0)
Print ( "Не удалось выставить ордер SELLSTOP");
}
}
//********************************************************************
// ФУНКЦИИ
//********************************************************************
//-----------------------функция подсчета ордеров------------------------------------
int CountTrades(
int otype=-1,// торговая операция, если -1 любая торговая операция
int magic=-1 // идентификатор, если -1 то любой идентификатор
)
{
int count=0; // обнуляем переменную
for(int i=OrdersTotal()-1; i>=0; i--) // перебор открытых и отложеных ордеров
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) // если получилось выбрать ордер
{
if(OrderSymbol()==Symbol()) // проверяем наш ли ордер
{
if(OrderType()==otype || otype==-1)
{
if(OrderMagicNumber()==magic || magic==-1)
{
count++; // плюсуем наши ордера
}
}
}
}
}
return(count);
}
//+------------------------------------------------------------------+
попробовал запустить на Демосчете, то что у меня получилось пока без стоплосса. При компиляции ошибок не выдает, но и торговать не хочет...
спасибо все получилось.
получилось, но не так как я хотел.
после того как я ввел дополнительную переменную Lots1 у Buy ордеров, объем сделок изменился.
Что нужно сделать чтобы проверялся еще и объем по сделкам?
чтобы было более понятно, торговля ведется по принципу открытия локовых ордеров, где Sell ордер всегда один (два,три) но с большим объемом:
extern double Lots = 0.1;
а количество ордеров Buy всегда больше но с меньшим объемом:
extern double Lots1 = 0.01;