посмотрите пожалуйста где я ошибся (не хочет работать)
хочу, чтобы при условии : if(GetLotSize()>LotControl)- сигнал на покупку смещался на параметр deviation * _Point (задается в параметрах)
LotControl -тоже задается в настройках
GetLotSize() -как рекомендовали:
double GetLotSize()
{
double Ls=0;
datetime last = 0, openTime;
for (int pos=OrdersTotal()-1;pos>=0;pos--)
{
if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
if ((openTime = OrderOpenTime()) > last) {
last = openTime;
Ls = OrderLots();
}
}
}
}
}
return Ls;
}
voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если нет открытых ордеров, то входим в условиеif(CountOrders()==0)
{
if(GetLotSize()>LotControl) {openPrice = dMA + deviation * _Point;}
else
openPrice = dMA;
//Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
}
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit// if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)// {// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка// CloseOrder();// }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
}
//+-----------------------------------------------------------------------------------------------+//| Функция проверки открытых оредров |//+-----------------------------------------------------------------------------------------------+int CountOrders()
{
int cnt=0;
int i=OrdersTotal()-1;
for(int pos=i;pos>=0;pos--)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==_Symbol)
{
if(OrderMagicNumber()==Magic) cnt++;
}
}
}
return(cnt);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на покупку |//+-----------------------------------------------------------------------------------------------+bool bSignalBuy()
{
if (openPrice > Open[1] && openPrice < Close[1]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.return(true);
return(false);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на продажу |//+-----------------------------------------------------------------------------------------------+bool bSignalSell()
{
if(openPrice< Open[1] && openPrice > Close[1])
return(true);
return(false);
}
if (bSignalBuy()) {
if (GetLotSize() > LotControl)
vOrderOpenSell();
else
vOrderOpenBuy();
}
Но всё равно открывается две разнонаправленных позиции на одном тике? Быть такого не может!
double GetLotSize()
{
double Ls=0;
datetime last = 0, openTime;
for (int pos=OrdersTotal()-1;pos>=0;pos--)
{
if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
if ((openTime = OrderOpenTime()) > last) {
last = openTime;
Ls = OrderLots();
}
}
}
}
}
return Ls;
}
На счёт этого кода, вполне может быть, что ничего не поменялось. Поскольку ордера идут в порядке закрытия.
Вы в своём алгоритме разберитесь как следует.
voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если нет открытых ордеров, то входим в условиеif(CountOrders()==0)
{
if(GetLotSize()>LotControl) {openPrice = dMA + deviation * _Point;}
else
openPrice = dMA;
//Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
}
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit// if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)// {// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка// CloseOrder();// }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
}
Здесь вообще, вход по сигналу Buy и Sell и дальше ничего. Что может здесь у вас не работать?... Не функций входа, ни функций выхода из рынка...
А здесь что? Вы ничего по сути не поменяли. Только сделали больше обращений к OrderCloseTime. Код вытянули в одну строку. И он стал менее читабельным. Но результат остался тот же.
А здесь что? Вы ничего по сути не поменяли. Только сделали больше обращений к OrderCloseTime. И код вытянули в одну строку. И он стал менее читабельным. Но результат остался тот же.
на сколько я вижу, то разница в следующем:
double GetLotSize()
{
double Ls=0;
datetime last = 0, openTime;
for (int pos=OrdersTotal()-1;pos>=0;pos--)
{
if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
if ((openTime = OrderOpenTime()) > last) {
last = openTime;
Ls = OrderLots();
}
}
}
}
}
return Ls;
}
здравствуйте !
посмотрите пожалуйста где я ошибся (не хочет работать)
хочу, чтобы при условии : if(GetLotSize()>LotControl)- сигнал на покупку смещался на параметр deviation * _Point (задается в параметрах)
LotControl -тоже задается в настройках
GetLotSize() -как рекомендовали:
Спасибо. не повлияло почему то.
Спасибо. не повлияло почему то.
Я написал:
Но всё равно открывается две разнонаправленных позиции на одном тике? Быть такого не может!
На счёт этого кода, вполне может быть, что ничего не поменялось. Поскольку ордера идут в порядке закрытия.
Вы в своём алгоритме разберитесь как следует.
Здесь вообще, вход по сигналу Buy и Sell и дальше ничего. Что может здесь у вас не работать?... Не функций входа, ни функций выхода из рынка...
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
MakarFX, 2021.12.02 18:30
А здесь что? Вы ничего по сути не поменяли. Только сделали больше обращений к OrderCloseTime. Код вытянули в одну строку. И он стал менее читабельным. Но результат остался тот же.
А здесь что? Вы ничего по сути не поменяли. Только сделали больше обращений к OrderCloseTime. Но результат тот же.
открой глаза
Аргументы в студию, пожалуйста
Аргументы в студию, пожалуйста
А теперь открой глаза
А здесь что? Вы ничего по сути не поменяли. Только сделали больше обращений к OrderCloseTime. И код вытянули в одну строку. И он стал менее читабельным. Но результат остался тот же.
на сколько я вижу, то разница в следующем:
А теперь открой глаза
Хорошо. Я упустил этот момент. Признаю.
на сколько я вижу, то разница в следующем: