Почему?:
Renat:
Без запуска можно сказать, что:
1. нет NormalizeDouble у SL, TP
2. нет NormalizeDouble у stake
Без запуска можно сказать, что:
1. нет NormalizeDouble у SL, TP
2. нет NormalizeDouble у stake
Спасибо, попробую.
Но при заданном фиксированном лоте (1.0, 0.1, ...) тот же скрипт работает с ненормализованными SL, TP.
Поставил только:
NormalizeDouble(stake,1);все заработало.
Кстати, Ваш тест стопов дал хороший результат: он свел мне и SL, и TP в Bid и на первом же тике закрыл позу (на демо, есствено), Ask у Вас игнорируется. Так я узнал, что брокер позволяет ставить стопы вплотную к рынку :).
Bookkeeper:
Кстати, Ваш тест стопов дал хороший результат: он свел мне и SL, и TP в Bid и на первом же тике закрыл позу (на демо, есствено), Ask у Вас игнорируется. Так я узнал, что брокер позволяет ставить стопы вплотную к рынку :).
Все зависит от настроек сервера. Такими темпами брокеры скоро
и до нулевого спреда дойдут.
Кстати, Ваш тест стопов дал хороший результат: он свел мне и SL, и TP в Bid и на первом же тике закрыл позу (на демо, есствено), Ask у Вас игнорируется. Так я узнал, что брокер позволяет ставить стопы вплотную к рынку :).
Renat:
....... Такими темпами брокеры скоро и до нулевого спреда дойдут.
....... Такими темпами брокеры скоро и до нулевого спреда дойдут.
Щазzzzzz. Хотя я где-то на форумах читал о брокерах со спредом 0,
5п. Правда там депо ого-го какой надо.
Попутно (продолжаю тему) посмотрите скрипт плиz:
//+------------------------------------------------------------------+ //| Open_BUY.mq4 | //| Скрипт открывает BUY (если есть денюшка) | //| Поза округляется до заданной части от депо | //| Bookkeeper, 2006, yuzefovich@gmail.com | //+------------------------------------------------------------------+ #property copyright "" #property link "" #property show_inputs // Если есть желание менять экстерны в процессе extern double share = 1.0; // Поза как часть депо 0.01-1.00 extern int Slippage = 5; // Проскальзывание extern int DistSL = 35; // Расстояние до SL extern int DistTP = 35; // Расстояние до TP extern bool stoplos = true; // Ставить или нет extern bool takeprofit = true; // Ставить или нет //+------------------------------------------------------------------+ void start() { int ticket; double SL=0,TP=0,stake,sharedepo; double step=MarketInfo(Symbol(),MODE_MINLOT); int dgts=MarketInfo(Symbol(),MODE_DIGITS); sharedepo=AccountFreeMargin()*share; if(sharedepo>step*1000) { stake=2*step; while(sharedepo>stake*1000) stake=stake+step; stake=stake-step; } else stake=step; NormalizeDouble(stake,1); if(AccountFreeMargin()<stake*1000) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if(stoplos==true) SL=Bid-DistSL*Point; if(takeprofit==true) TP=Ask+2*DistTP*Point; ticket=OrderSend(Symbol(),OP_BUY,stake,Ask,Slippage, NormalizeDouble(SL,dgts), NormalizeDouble(TP,dgts), "",0,0,CLR_NONE); 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); } } //+------------------------------------------------------------------+в части определения stake. Как можно определить stake, чтоб не пролететь с округлением Double? А то перебором, как здесь - это унизительно.
Bookkeeper писал (а):
Вот этот блок. В том числе - как нормализовать stake с той же точностью,
что и MINLOT.
sharedepo=AccountFreeMargin()*share; if(sharedepo>step*1000) { stake=2*step; while(sharedepo>stake*1000) stake=stake+step; stake=stake-step; } else stake=step; NormalizeDouble(stake,1);
stake=NormalizeDouble(stake,1); if(stake<MarketInfo(Symbol(),MODE_MINLOT)) stake=MarketInfo(Symbol(),MODE_MINLOT); if(stake>MarketInfo(Symbol(),MODE_MAXLOT)) stake=MarketInfo(Symbol(),MODE_MAXLOT);
Не совсем то. Зато теперь работает все. ИСПРАВЛЕНО (?)
И то же для шорта:
//+------------------------------------------------------------------+
//| _Open_BUY.mq4 |
//| "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//| Скрипт открывает BUY (если есть денюшка) |
//| Поза округляется до заданной части Share от депо |
//| Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
#property show_inputs // Если есть желание менять экстерны в процессе
extern double Share = 1.0; // Поза как часть депо 0.01-1.00
extern int DistSL = 35; // Расстояние до SL
extern int DistTP = 35; // Расстояние до TP
extern int Slippage = 5; // Проскальзывание
extern bool StopLoss = true; // Ставить или нет
extern bool TakeProfit = true; // Ставить или нет
//+------------------------------------------------------------------+
void start()
{
int ticket;
double SL=0,TP=0,Stake,StepDgts;
double Step=MarketInfo(Symbol(),MODE_MINLOT);
int Dgts=MarketInfo(Symbol(),MODE_DIGITS);
if(Share>1.0) Share=1.0; // Часть не бывает больше целого
if(Step<0.1) StepDgts=2;
else
{
if(Step<1.0) StepDgts=1;
else StepDgts=0;
}
Stake=NormalizeDouble(AccountFreeMargin()*Share/1000/Ask,StepDgts);
if(AccountFreeMargin()<Stake*1000*Ask) // Округление бывает и вверх
Stake=NormalizeDouble(Stake-Step,StepDgts); // Теперь лишку не будет
if(Stake<Step) return(0);
if(StopLoss==true) SL=Bid-DistSL*Point;
if(TakeProfit==true) TP=Ask+2*DistTP*Point;
ticket=OrderSend(Symbol(),OP_BUY,Stake,Ask,Slippage,
NormalizeDouble(SL,Dgts),
NormalizeDouble(TP,Dgts),
"",0,0,CLR_NONE);
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);
}
}
//+------------------------------------------------------------------+
И то же для шорта:
//+------------------------------------------------------------------+
//| _Open_SELL.mq4 |
//| "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//| Скрипт открывает SELL (если есть денюшка) |
//| Поза округляется до заданной части Share от депо |
//| Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
#property show_inputs // Если есть желание менять экстерны в процессе
extern double Share = 1.0; // Поза как часть депо 0.01-1.00
extern int DistSL = 35; // Расстояние до SL
extern int DistTP = 35; // Расстояние до TP
extern int Slippage = 5; // Проскальзывание
extern bool StopLoss = true; // Ставить или нет
extern bool TakeProfit = true; // Ставить или нет
//+------------------------------------------------------------------+
void start()
{
int ticket;
double SL=0,TP=0,Stake,StepDgts;
double Step=MarketInfo(Symbol(),MODE_MINLOT);
int Dgts=MarketInfo(Symbol(),MODE_DIGITS);
if(Share>1.0) Share=1.0; // Часть не бывает больше целого
if(Step<0.1) StepDgts=2;
else
{
if(Step<1.0) StepDgts=1;
else StepDgts=0;
}
Stake=NormalizeDouble(AccountFreeMargin()*Share/1000/Ask,StepDgts);
if(AccountFreeMargin()<Stake*1000*Bid) // Округление бывает и вверх
Stake=NormalizeDouble(Stake-Step,StepDgts); // Теперь лишку не будет
if(Stake<Step) return(0);
if(StopLoss==true) SL=Ask+DistSL*Point;
if(TakeProfit==true) TP=Bid-2*DistTP*Point;
ticket=OrderSend(Symbol(),OP_SELL,Stake,Bid,Slippage,
NormalizeDouble(SL,Dgts),
NormalizeDouble(TP,Dgts),
"",0,0,CLR_NONE);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else
{
Print("Error opening BUY order : ",GetLastError());
return(0);
}
}
//+------------------------------------------------------------------+
Вы неправильно пользуетесь NormalizeDouble.
Строки такого вида абсолютно бесполезны, так как результат нормализации никуда не присваивается.
Строки такого вида абсолютно бесполезны, так как результат нормализации никуда не присваивается.
NormalizeDouble(Stake,StepDgts);
Renat:
Вы неправильно пользуетесь NormalizeDouble.
Строки такого вида абсолютно бесполезны, так как результат нормализации никуда не присваивается.
Вы неправильно пользуетесь NormalizeDouble.
Строки такого вида абсолютно бесполезны, так как результат нормализации никуда не присваивается.
NormalizeDouble(Stake,StepDgts);
Спасибо! Отредактировал (пред. пост). Надеюсь теперь ничего не напортачил?
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь