/*Функция вычисляет лот в зависимости от последнего зафиксированного лота Аргументы: k- величина 1, на которую умножается рабочий объем при последнем отрицательном профите, max_profit-величина 2, magic-Magic Number позиций эксперта, */ double get_lot(double k,double max_profit, int magic) { double lot=0.1,last_profit=0,last_lot=0; datetime last_time=0; for(int i=0;i<0;i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if(OrderSymbol()!=Symbol()||OrderType()>OP_SELL) continue; if(OrderMagicNumber()!=magic) continue; if(OrderCloseTime()>last_time) { last_time=OrderCloseTime(); last_profit=OrderProfit(); last_lot=OrderLots(); } } } if(last_time>0) { if(last_profit<0) lot=k*last_lot; else if(last_profit>0&&last_profit<max_profit) lot=last_lot; } return(lot); }
Это значит что функцию надо вызвать, для того чтобы она начала работать...
Dmitrii610, во внешние параметры эксперта вставьте
extern int Magic =96784; extern double k = 1.4; extern double max_profit = задать профит;
А перед функциями OrderSend задайте сам вызов функции -
(только с постоянным размером лота тож решите вопрос)
Lots=get_lot()// Покупаем : ticket=OrderSend(Symbol(),0,Lots,... ...
Где я сделал ошибку? выдает такоую ошибку: ')' - wrong parameters count
extern int MaximumRisk=4; extern double k=1.1; extern double max_profit=90; extern int MinLots=2; extern int Rezerv=0; extern bool LotConst=false; extern double lots=0.1; extern int MagicNumber=5589144; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double get_lot(double lot) {double lot=NormalizeDouble((AccountBalance( ) + Rezerv)*MaximumRisk/(StopLoss*1000),MinLots); if (LotConst)lot=lots;
double last_profit=0,last_lot=0;
datetime last_time=0;
for(int i=0;i<0;i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()!=Symbol()||OrderType()>OP_SELL)
continue;
if(OrderMagicNumber()!=MagicNumber)
continue;
if(OrderCloseTime()>last_time)
{
last_time=OrderCloseTime();
last_profit=OrderProfit();
last_lot=OrderLots();
}
}
}
if(last_time>0)
{
if(last_profit<0)
lot=k*last_lot;
else if(last_profit>0&&last_profit<max_profit)
lot=last_lot;
}
return(lot);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double BuyPrice;
double BuyStopLoss;
double BuyTakeProfit;
double SellPrice;
double SellStopLoss;
double SellTakeProfit;
double StopLoss;
//----
bool need_long =true;
bool need_short=true;
if(need_long)
lots=get_lot();
ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,BuyPrice,3,BuyStopLoss,BuyTakeProfit,"",MagicNumber,0,Green);
if(need_short)
lots=get_lot();
ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,SellPrice,3,SellStopLoss,SellTakeProfit,"",MagicNumber,0,Red);
}
//+------------------------------------------------------------------+
в функции get_lot()
double get_lot(double lot)
{
}
Ты объявил её как функцию принимающую один аргумент double типа, а при её вызове никаких её параметров в аргументе не передаешь:
lots=get_lot(/*вот тут должен быть аргумент*/);
все исправил ошибок не выдает только теперь советник стал открывать кучу новых ордеров вместо одного. что делать?
(код только упраления капиталом надеюсь понятно)
extern int MaximumRisk=4; extern double k=1.1; extern double max_profit=90; extern int MinLots=2; extern int Rezerv=0; extern bool LotConst=false; extern double lots=0.1; extern int MagicNumber=5589144; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double get_lot(double k,double max_profit, int MagicNumber) { double lot1=NormalizeDouble((AccountBalance( ) + Rezerv)*MaximumRisk/(StopLoss*1000),MinLots); if (LotConst)lot1=lots; double lot=lot1; double last_profit=0,last_lot=0; datetime last_time=0; for(int i=0;i<0;i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if(OrderSymbol()!=Symbol()||OrderType()>OP_SELL) continue; if(OrderMagicNumber()!=MagicNumber) continue; if(OrderCloseTime()>last_time) { last_time=OrderCloseTime(); last_profit=OrderProfit(); last_lot=OrderLots(); } } } if(last_time>0) { if(last_profit<0) lot=k*last_lot; else if(last_profit>0&&last_profit<max_profit) lot=last_lot; } return(lot); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int cnt, ticket; string TradeSymbol=Symbol(); double BuyPrice; double BuyStopLoss; double BuyTakeProfit; double SellPrice; double SellStopLoss; double SellTakeProfit; double StopLoss; //---- bool need_long =true; bool need_short=true; if(need_long) lots=get_lot(k, max_profit, MagicNumber); ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,BuyPrice,3,BuyStopLoss,BuyTakeProfit,"",MagicNumber,0,Green); if(need_short) lots=get_lot(k, max_profit, MagicNumber); ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,SellPrice,3,SellStopLoss,SellTakeProfit,"",MagicNumber,0,Red); } //+------------------------------------------------------------------+
Учить MQL4.
Если в твоем эксперте нужно работать только одной позцией, то перед её открытие нужно провести проверку на наличие открытых.
Это можно сделать с помощью функции ExistPositions(), либо как вариант попроще использовать функцию OrdersTotal()
Например:
if(OrdersTotal()==0)
{
//тут открываем позции
}
у вас почему-то функция int start() повисла в воздухе.Может её нужно завершить
return(0); ?
И ещё. Если вы в внеш. парамерах задаёте постоянный размер лота (extern double lots=0.1;)
. То зачем вам блок расчета лотов?
Я ничего не трогал там. Только вставил проверку наличия позиций.
==примерно так можно ограничить число открытых позиций. В конце кода поставлена функция проверки наличия ордеров эксперта. А перед открытием позиций реализован её вызов
if (!ExpertOrder(MagicShort)) {//если открытых позиций нет
тогда ваш код будет :
( не забудьте "закрыть" функцию int start() )
extern int MaximumRisk=4; extern double k=1.1; extern double max_profit=90; extern int MinLots=2; extern int Rezerv=0; extern bool LotConst=false; extern double lots=0.1; extern int MagicNumber=5589144; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double get_lot(double k,double max_profit, int MagicNumber) { double lot1=NormalizeDouble((AccountBalance( ) + Rezerv)*MaximumRisk/(StopLoss*1000),MinLots); if (LotConst)lot1=lots; double lot=lot1; double last_profit=0,last_lot=0; datetime last_time=0; for(int i=0;i<0;i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if(OrderSymbol()!=Symbol()||OrderType()>OP_SELL) continue; if(OrderMagicNumber()!=MagicNumber) continue; if(OrderCloseTime()>last_time) { last_time=OrderCloseTime(); last_profit=OrderProfit(); last_lot=OrderLots(); } } } if(last_time>0) { if(last_profit<0) lot=k*last_lot; else if(last_profit>0&&last_profit<max_profit) lot=last_lot; } return(lot); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int cnt, ticket; string TradeSymbol=Symbol(); double BuyPrice; double BuyStopLoss; double BuyTakeProfit; double SellPrice; double SellStopLoss; double SellTakeProfit; double StopLoss; //---- bool need_long =true; bool need_short=true; if (!ExpertOrder(MagicShort)) {//если открытых позиций нет //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж if(need_long) lots=get_lot(k, max_profit, MagicNumber); ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,BuyPrice,3,BuyStopLoss,BuyTakeProfit,"", MagicNumber,0,Green); if(need_short) lots=get_lot(k, max_profit, MagicNumber); ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,SellPrice,3,SellStopLoss,SellTakeProfit,"", MagicNumber,0,Red); //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж } //если открытых позиций нет } //+------------------------------------------------------------------+ //---- Функция проверки наличия ордеров эксперта -----------------------+ //----------------------------------------------------------------------+ // false - ордеров данного эксперта нет; | // true - есть ордера данного эксперта; | //----------------------------------------------------------------------+ bool ExpertOrder (int VersionID){ bool result=false; int _OrdersTotal=OrdersTotal(); if (_OrdersTotal>0) {for (int jk=0; jk<_OrdersTotal; jk++) { if (OrderSelect(jk, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber()==VersionID) { result=true; break; }//Найден ордер принадлежащий эксперту else { result=false; } } } } else { result=false; } //--------------------- return(result);}
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Господа MQL4 програмисты помогите с написанием блока в советнике.
Задача такая: необходимо брать закрытые последнии ордера из истории и если профит отрицательный необходимо умножить рабочий лот на некую величину 1, если он положительный но вссе равно меньше некой величины 2, то лот остается прежним, если профит в последней закрытой сделке больше величины 2, то лот обнуляется и цыкл увеличения лота повторяется, пока встречаются отрицательные сделки. Лот необходимо просчитывать и изменять после каждой закрытой сделки.
Скинте кодик кому не сложно. Хочу дописать свой советник вот тест (прилагаю)
спасибо.