Разделить перебором в цикле.Как получить количество открытых ордеров
OrdersToral() выводит еще и отложенные ордера, а нужны именно открытые
Я один из тех, кто скачал твоего сова: там бурелом полный - ты писал его линейно, используя функции внутри тиковой (OnTick) и переменные, отвечающие за лотность и т.п., должны быть жестко обозначены в нужных местах. Короче, мне просто лень разбираться (сорри!) - проще с нуля написать код с сепарацией по функциям и расчетам. Помимо меня еще 3-е скачали твоего сова - может они помогут...Помогите понять в каком месте я не так слделал
Как получить количество открытых ордеров
OrdersToral() выводит еще и отложенные ордера, а нужны именно открытые
int R=0;
int start()
{
for(int i=OrdersTotal();i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderType()==OP_BUY)R=R+1;
if(OrderType()==OP_SELL)R=R+1;
}
}
Alert("Всего открытых ордеров=",R);
return(0);
}
Пож. Обратите внимание. Кароч классический стохастик только на 2 бара назад ситуация противоположная. (1+1)Signal++Помогите написать условия:
Если 2 Бара "назад" от текущего бара Период%K Стохастика был НИЖЕ Замедления ИПериод%К на текущем Баре ВЫШЕ Замедления = сигнал sell
Это так на уровне чайника). Синяя линия это 2 бара назад а зелёная это текущий бар.for(int i=2 ; i<=Bars; i++)
{
iBars("EURUSD",PERIOD_H1));
if (iBars >…
}
Замудрил я для того чтоб сова ждала этого сигнала а неоткрывала ордера при пересеченых стохастиках где-то в середине после закрытия ордера после SL или TP.
Такой цикл будет покрасивей читатьсяPHP:int R=0;int start() { for(int i=OrdersTotal();i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { if(OrderType()==OP_BUY)R=R+1; if(OrderType()==OP_SELL)R=R+1; } } Alert("Всего открытых ордеров=",R); return(0); }
[COLOR=#000000][COLOR=#007700] int R = 0;
for([/COLOR][COLOR=#0000BB]int i[/COLOR][COLOR=#007700] =[/COLOR][COLOR=#0000BB] OrdersTotal[/COLOR][COLOR=#007700](); [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]>=[/COLOR][COLOR=#0000BB] 0[/COLOR][COLOR=#007700]; --[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700])
{
if([/COLOR][COLOR=#0000BB]OrderSelect[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB] SELECT_BY_POS[/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB][/COLOR][COLOR=#007700]) && [/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#0000BB]OrderType[/COLOR][COLOR=#007700]() < [/COLOR][COLOR=#0000BB]OP_[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000BB]BUYLIMIT[/COLOR][COLOR=#007700][/COLOR][/COLOR][/COLOR][COLOR=#007700]) [/COLOR][COLOR=#007700]
[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000BB]R+[/COLOR][COLOR=#0000BB][/COLOR][COLOR=#007700]+[/COLOR][COLOR=#0000BB][/COLOR][COLOR=#007700];
}
[/COLOR][/COLOR]
Ну так ты-же всё уже сам написал...Пож. Обратите внимание.
Ну так ты-же всё уже сам написал...
Чтобы сравнить что-то с чем-то, это что-то надо иметь...
Вот и получи значения стохастика на втором баре и на нулевом. -https://docs.mql4.com/ru/indicators/istochastic
Получится 4 значения, или точней две пары значений которые надо сравнивать. А вот потом, после того как откроется ордер, чтобы не открывались лишние ордера надо поставить дополнительные условия. Но с этим мне кажется проблемы нет...
Все элементарно: запускаешь цикл типа этогоКак получить количество открытых ордеров
Ну почему не хватит? Я дал тебе ссылку как получить значение стохастика. Там последний параметр функции и есть номер бара значение на котором надо получить, есть и номер линии значение которой надо получить... Разницы-то никакой тот пример будешь читать или который я напишу. Зато если в этом разберёшься досконально не будет возникать других подобных вопросов... Дерзай, всё получится, не сомневайся.Я открыл учебник по MQL4 и понял что моего IQ нехватит его осилить. Потому и просьба если незатруднит написать основной код. А "допилить" я как нить сам попробую.
Как получить количество открытых ордеров
OrdersToral() выводит еще и отложенные ордера, а нужны именно открытые
int buys_,sells_,buys_S,sells_S,buys_L,sells_L,Orders_Total;
...
CountOpenedPositions_f();
...
void CountOpenedPositions_f()
{
buys_=0;sells_=0;
buys_S=0;sells_S=0;
buys_L=0;sells_L=0;
Orders_Total=0;
int type;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
type=OrderType();
if(type==OP_BUY) buys_++;
else
if(type==OP_SELL) sells_++;
else
if(type==OP_BUYSTOP) buys_S++;
else
if(type==OP_SELLSTOP) sells_S++;
else
if(type==OP_BUYLIMIT) buys_L++;
else
if(type==OP_SELLLIMIT) sells_L++;
}
Orders_Total=buys_+sells_+buys_S+sells_S+buys_L+sells_L;
}
Там последний параметр функции и есть номер бара значение на котором надо получить, есть и номер линии значение которой надо получить...
Помогите понять в каком месте я не так слделал
советник должен добавлять 0.01 лота с каждым купленным ордером, но почему то первые два ордера берет с лотом 0.01 а вот третий уже берет 0.03
где ошибка?
if(Martin==true)
{
total=count();
PHP:if(Martin==true) { total=count();
Так и нужно.Вот спасибо, а можете написать как нужно. прошу простить за просьбу
Так и нужно.
Когда оно ровно? С нчала кода? После того как оно ровно стало, кучу раз ордера могли закрытся. Нужно пересчитывать непосредственно перед использыванием.Так ведь total и так равно count()
ничего не поменялось, как брал первые два с лотом 0.01 так и берет
if(Martin==true)
{
total=count();
if(total==0){f=1;}
if(total>=1){f=total;}
LotB=Lots_New*f;
LotS=Lots_New*f;
}
if(total>=1)
{
f=total+1;
Когда оно ровно? С нчала кода? После того как оно ровно стало, кучу раз ордера могли закрытся. Нужно пересчитывать непосредственно перед использыванием.
2) А это вторая ошибка
PHP:if(total>=1) { f=total+1;
Когда оно ровно? С нчала кода? После того как оно ровно стало, кучу раз ордера могли закрытся. Нужно пересчитывать непосредственно перед использыванием.
Именно в этом и была ошибка вот тут:
if(DrawdownPercent>DepoProcent)//Если просадка достигла заданной
{
int CloseTotal=total;
int CloseTotal=count();//нужно так
for(int p=CloseTotal-1; p>=0; p--)
{
if(OrderSelect(p,SELECT_BY_POS))
{ //Закрываем все ордера
if(OrderType()==OP_BUY)OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red);
if(OrderType()==OP_SELL)OrderClose(OrderTicket(), OrderLots(), Ask, 3, Red);
}
}
}