[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 81

 

extern bool BUY = true;
extern int Magic = 0;
extern double Lot = 0.1;
extern int takeprofit = 0;
extern int stoploss = 0;
extern int slippage = 3;
double SL,TP;
int init(){
return(0);
}
int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;
OPENORDER ("Buy");

BUY=false;
}

return(0);
}
void OPENORDER(string ord)
{
int error;
while (true)
{ error=true;
if (ord=="Buy") error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0){BUY = false;}
}
return;
}

 
nemo811:

Дайте, пожалуйста, пример. Я только учусь, и ещё не сталкивался с задачей установки флага. )
судя по коду у вас в одном месте идёт проврка условия перед открытием ордера. просто меняете переменную на false и всё, на след тике прога не войдёт в этот блок и советник больше ничего не откроет до перезапуска.
 
nemo811:

Подскажите, пожалуйста, как в советнике разрешить лишь однократное выполнение условия (к примеру, открытие ордера), а не повторение его с каждым тиком. При этом при закрытии позиции советник не должен открывать новую. Я попытался изобразить, но не выходит, что задумывалось.

Заранее благодарю.



почему Вы назвали переменную в которую сохранится тикет ордера error ?

if (ord=="Buy") error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0){BUY = false;}

почитайте про OrderSend(), думаю вопросы сами снимутся, я бы написал примерно так:

void OPENORDER(string ord)
{
int ticket = -1;
 while (ticket<0)
 {ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0);
  sleep(500);
}
return;
}
 
IgorM:



Может вы читали чуть ранее я озвучил свою проблму. Вроде как подобрали решение, но я не могу айти в книжке как в mql работать со строкой(

как вынуть поштучно из строки цифры?

 
NameLess:


Может вы читали чуть ранее я озвучил свою проблму. Вроде как подобрали решение, но я не могу айти в книжке как в mql работать со строкой(

как вынуть поштучно из строки цифры?


Создайте скрипт, который поэкспериментирует со строковыми функциями MQL4 - смотрите тут https://docs.mql4.com/ru/strings
 

ZERO

по каким правилам, к примеру?

 
drknn:

Создайте скрипт, который поэкспериментирует со строковыми функциями MQL4 - смотрите тут https://docs.mql4.com/ru/strings/StringSubstr

спасибо!
 
NameLess:


Может вы читали чуть ранее я озвучил свою проблму. Вроде как подобрали решение, но я не могу айти в книжке как в mql работать со строкой(

как вынуть поштучно из строки цифры?

нужно перевести число в строку https://docs.mql4.com/ru/convert/DoubleToStr

нужно отрезать от начала https://docs.mql4.com/ru/strings/StringLen часть строки https://docs.mql4.com/ru/strings/StringSubstr

и перевести всё обратно в вещественный тип https://docs.mql4.com/ru/convert/StrToDouble

вот и все необходимые ф-ции по работе со строками, возможно Вам хватит StrToDouble()

но таким "некрасивым способом" Вы точно отрежете, а не округлите число, есть еще вариант: умножить вещественное число на 10 в степени х, и присвоить результат типу int - если не ошибаюсь, то округления тоже не будет, затем разделите int на 10 в степени x

 
IgorM:

нужно перевести число в строку https://docs.mql4.com/ru/convert/DoubleToStr

нужно отрезать от начала https://docs.mql4.com/ru/strings/StringLen часть строки https://docs.mql4.com/ru/strings/StringSubstr

и перевести всё обратно в вещественный тип https://docs.mql4.com/ru/convert/StrToDouble

вот и все необходимые ф-ции по работе со строками, возможно Вам хватит StrToDouble()

но таким "некрасивым способом" Вы точно отрежете, а не округлите число, есть еще вариант: умножить вещественное число на 10 в степени х, и присвоить результат типу int - если не ошибаюсь, то округления тоже не будет, затем разделите int на 10 в степени x


мне хотябы *отрезать*, т.к. число получается вынуть из индикатора только в строку.. спасибо за совет, буду экспериментировать)
 

IgorM:

NameLess:

Спасибо за помощь. Логику с установкой флага и функцией возвращения количества ордеров я понял. Но меня ещё интересует момент, когда ордер закрывается. Получается, что условие флага снова стремится поставить ордер, а функция возвращения говорит, что ордеров стало на 1 меньше и тоже инициализирует открытие позиции. Поправьте, если я что упустил.
Причина обращения: