в чем логическая ошибка кода?

 
double high1;
double high2;
double high3;
double high4;
double high5;
double close1;
double close2;
double close3;
double low1;
double low2;
double low3;
double low4;
double low5;
double open1;
double open2;
double open3;
double close4;
int a=0;
double b=10000.0;
int i=1;

high2=iHigh(Symbol(),0,i+1);
high3=iHigh(Symbol(),0,i+2);
close1=iClose(Symbol(),0,i);
close2=iClose(Symbol(),0,i+1);
low1=iLow(Symbol(),0,i);
low2=iLow(Symbol(),0,i+1);
low3=iLow(Symbol(),0,i+2);
open1=iOpen(Symbol(),0,i);
if((high3>high2)&&(close2<close1)&&(low2<low3)&&(open1<close2)&&(close1>close2)&&(low1<low2))\\\ определяется цена выше которой должен советник открыть сделку
{
b=high2;\\\записывается цена в переменную
}

if(iOpen(NULL,0,0)>b)\\\далее проверяется если цена открытия текущего бара больше чем цена в переменной и количество открытых ордеров равно нулю то мы отправляем рыночный ордер на покупку
{
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)

{
OrderSend(Symbol(),OP_BUY,0.1,Ask,7,Ask-30*Point,Ask+90*Point,0,0,0,Green);

}\\\потому присваиваем переменной значение больше чем может быть любая цена на рынке для того чтобы избежать повторных входов выше этой цены...таким образом мы избегаем того что сделки будут открыватся постоянно по закрытию текущей сделки и повторных входов на одних и тех же барах так как установленная в переменную цена больше чем есть на рынке до тех пор пока заново не образуются условия для входа и не запишутся в переменную b
b=10000;

}

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

 

Если в момент закрытия старой сделки ваши условия открытия выполняются, а это вполне возможно, позиция будет открыта снова, так как ваше присвоение b=10000, которое само по не самый лучший способ контроля, будет обновлено на b=high2.

Найдите более изящный способ контроля цены открытия.

 
pro_:

Если в момент закрытия старой сделки ваши условия открытия выполняются, а это вполне возможно, позиция будет открыта снова, так как ваше присвоение b=10000, которое само по не самый лучший способ контроля, будет обновлено на b=high2.

Найдите более изящный способ контроля цены открытия.


может подскажите а то ничего в голову не лезет второй день не могу решить эти проблемы.....нужно чтобы сделка открывалась один раз только когда текущая свеча откроется выше или ниже определенной цены и не открывалась к примеру до следующего аналогичного условия но могла быть открыта при других условиях...как такое возможно реализовать?
 
Zver4991:

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

вроде получилось при минимуме кода максимум результата создать в такой способ решил эти проблемы

if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False){

if((high3>high2)&&(close2<close1)&&(low2<low3)&&(open1<close2)&&(close1>close2)&&(low1<low2))

{

b=high2;

}

if(iOpen(NULL,0,0)>b)

{

OrderSend(Symbol(),OP_BUY,0.1,Ask,7,Ask-120*Point,Ask+120*Point,0,0,0,Green);

b=10000;

}

}

немного кода местами сменил..спасибо что помогли сначала

 
Здравствуйте!
Разделяю смысловые части.

Первое.
Зачем вы создали новую ветку на форуме? Уже существует ветка, в которой задают такие вопросы. Вот она https://forum.mql4.com/ru/56236 .
Там вам помогут.

Второе.
Учимся вставлять код MQ4.
Ctrl + Alt + M
 
Вам нужна одна логическая часть которая проверяет "торговать/не торговать" и вторая "покупать/не покупать".
В вашем случае "условия торговли" это: 1) нет открытых позиций; 2) условие определения цены покупки; 3) новый бар;
Условий покупки 2 (!): 1) разрешение на торговлю на основе наличия условий торговли и 2) непосредственно пробитие ценой уровня открытия позиции.

То есть:

bool Active = false;
if ( ... условие(-ия) торговли.... ) {  // одно или несколько условий, можно вложить одно в другое с помощью нового if
	Active = true;
}

if (Active){                            // разрешение на торговлю на основе наличия условий торговли
	if ( ... условие покупки (или продажи)... ) { 
		OrderSend(...);
		Active=false;
	}
}

Вот что то в этом роде. Поиск "семафоров", "переключателей", "разрешений торговать" может вывести на более оригинальные решения, варианты этой структуры, но ваша главная проблема это определение 3-го условия торговли.

Поиск поможет найти приемлемое решение.

И уберите ваше b=10000; :)

 
понимаю достал уже но не подскажите как получить время закрытия последнего ордера что был исполнен
 
Вам в ветку "Полезные функции от Кима". Там это и не только это найдете.
 
Zver4991:
понимаю достал уже но не подскажите как получить время закрытия последнего ордера что был исполнен

Если закрывается советником по условиям, то время можно сохранять после OrderClose, если по TP/SL то функцией Кима.
 
pro_:
Вам в ветку "Полезные функции от Кима". Там это и не только это найдете.

Что же вы посылаете его вот так, без ссылки?

Ссылочка вам, уважаемый https://forum.mql4.com/ru/38949 . :)
 
Link_x:

Что же вы посылаете его вот так, без ссылки?

Ссылочка вам, уважаемый https://forum.mql4.com/ru/38949 . :)

А поиску тоже учиться надо, о великий учитель )))

А также вставлять ссылки...

Причина обращения: