Ваши вопросы по языку MQL4

STARGAZER

Новичок форума
Как получить количество открытых ордеров
OrdersToral() выводит еще и отложенные ордера, а нужны именно открытые
 

STARGAZER

Новичок форума
Помогите понять в каком месте я не так слделал
советник должен добавлять 0.01 лота с каждым купленным ордером, но почему то первые два ордера берет с лотом 0.01 а вот третий уже берет 0.03
где ошибка?
 

Вложения

  • SETKA.mq4
    16,5 КБ · Просмотры: 29

vladradon

Программист
Помогите понять в каком месте я не так слделал
Я один из тех, кто скачал твоего сова: там бурелом полный - ты писал его линейно, используя функции внутри тиковой (OnTick) и переменные, отвечающие за лотность и т.п., должны быть жестко обозначены в нужных местах. Короче, мне просто лень разбираться (сорри!) - проще с нуля написать код с сепарацией по функциям и расчетам. Помимо меня еще 3-е скачали твоего сова - может они помогут...
 

Rennela

Новичок форума
Как получить количество открытых ордеров
OrdersToral() выводит еще и отложенные ордера, а нужны именно открытые

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);
  }
 

maximuson

Новичок форума
Стохастик

Помогите написать условия:

Если 2 Бара "назад" от текущего бара Период%K Стохастика был НИЖЕ Замедления ИПериод%К на текущем Баре ВЫШЕ Замедления = сигнал sell


for(int i=2 ; i<=Bars; i++)
{
iBars("EURUSD",PERIOD_H1));
if (iBars >…
}
Это так на уровне чайника). Синяя линия это 2 бара назад а зелёная это текущий бар.
Замудрил я для того чтоб сова ждала этого сигнала а неоткрывала ордера при пересеченых стохастиках где-то в середине после закрытия ордера после SL или TP.
Пож. Обратите внимание. Кароч классический стохастик только на 2 бара назад ситуация противоположная. (1+1)Signal++
 

Вложения

  • Screenshot_2016-12-10-15-03-04.png
    Screenshot_2016-12-10-15-03-04.png
    62,5 КБ · Просмотры: 16
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
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]
 

AlexeyVik

Программист mql4 mql5
Пож. Обратите внимание.
Ну так ты-же всё уже сам написал...
Чтобы сравнить что-то с чем-то, это что-то надо иметь...
Вот и получи значения стохастика на втором баре и на нулевом. -https://docs.mql4.com/ru/indicators/istochastic
Получится 4 значения, или точней две пары значений которые надо сравнивать. А вот потом, после того как откроется ордер, чтобы не открывались лишние ордера надо поставить дополнительные условия. Но с этим мне кажется проблемы нет...
 
Последнее редактирование:

maximuson

Новичок форума
Ну так ты-же всё уже сам написал...
Чтобы сравнить что-то с чем-то, это что-то надо иметь...
Вот и получи значения стохастика на втором баре и на нулевом. -https://docs.mql4.com/ru/indicators/istochastic
Получится 4 значения, или точней две пары значений которые надо сравнивать. А вот потом, после того как откроется ордер, чтобы не открывались лишние ордера надо поставить дополнительные условия. Но с этим мне кажется проблемы нет...

Я открыл учебник по MQL4 и понял что моего IQ нехватит его осилить. Потому и просьба если незатруднит написать основной код. А "допилить" в советник я как нить сам попробую.
 

vladradon

Программист
Как получить количество открытых ордеров
Все элементарно: запускаешь цикл типа этого
int Orders_Total(int Type,int Magic)
{
int totalmagic=0;
RefreshRates();
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==Type)
totalmagic++;
}
return(totalmagic);
}
В котором задаешь тип ордеров, которые хочешь посчитать и суммируешь их, если нужно.
Это я функцию привел к примеру, в которой задаются тип ордеров и магик.
 

AlexeyVik

Программист mql4 mql5
Я открыл учебник по MQL4 и понял что моего IQ нехватит его осилить. Потому и просьба если незатруднит написать основной код. А "допилить" я как нить сам попробую.
Ну почему не хватит? Я дал тебе ссылку как получить значение стохастика. Там последний параметр функции и есть номер бара значение на котором надо получить, есть и номер линии значение которой надо получить... Разницы-то никакой тот пример будешь читать или который я напишу. Зато если в этом разберёшься досконально не будет возникать других подобных вопросов... Дерзай, всё получится, не сомневайся.
 

eevviill2

Местный знаток
Как получить количество открытых ордеров
OrdersToral() выводит еще и отложенные ордера, а нужны именно открытые
PHP:
 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;
 }
 
Последнее редактирование:

maximuson

Новичок форума
Там последний параметр функции и есть номер бара значение на котором надо получить, есть и номер линии значение которой надо получить...

shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Спасибо) Я только учусь.
 

eevviill2

Местный знаток
Помогите понять в каком месте я не так слделал
советник должен добавлять 0.01 лота с каждым купленным ордером, но почему то первые два ордера берет с лотом 0.01 а вот третий уже берет 0.03
где ошибка?
PHP:
   if(Martin==true)
     {
     total=count();
 

eevviill2

Местный знаток
Так ведь 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;
}
Когда оно ровно? С нчала кода? После того как оно ровно стало, кучу раз ордера могли закрытся. Нужно пересчитывать непосредственно перед использыванием.

2) А это вторая ошибка
PHP:
if(total>=1)
      {
      f=total+1;
 

STARGAZER

Новичок форума
Когда оно ровно? С нчала кода? После того как оно ровно стало, кучу раз ордера могли закрытся. Нужно пересчитывать непосредственно перед использыванием.

2) А это вторая ошибка
PHP:
if(total>=1)
      {
      f=total+1;

Да, вы правы, есть еще и третья когда почему то они у меня закрываются тут

//проверим превышение максимального количества ордера
//пропишем цикл как именно вычислить закрытие ордера который по количеству больше чем MaximumOrders
//и по цене больше чем цена предыдущего открытого ордера
if(count()>MaximumOrders)

{
if(OrderSelect(count()-2,SELECT_BY_POS))
{
//тут получим цену открытия предыдущего ордера price_pr
double price_pr=OrderOpenPrice();// цена открытия выбранного ордера

}
}
//+------------------------------------------------------------------+
if(count()-MaximumOrders>0)// && totalOrders>sss+1)
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderSelect(count()-1,SELECT_BY_POS))
{
//тут сравним цену
double prise_tech=MarketInfo(Symbol(),MODE_BID);


if(OrderType() == OP_BUY&&prise_tech>price_pr) OrderClose(OrderTicket(), OrderLots(), Bid, 3, Blue);
if(OrderType() == OP_SELL&&prise_tech<price_pr) OrderClose(OrderTicket(), OrderLots(), Ask, 3, Red);


// return(0);

}
}
}
 

STARGAZER

Новичок форума
Когда оно ровно? С нчала кода? После того как оно ровно стало, кучу раз ордера могли закрытся. Нужно пересчитывать непосредственно перед использыванием.

Именно в этом и была ошибка вот тут:

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);
}
}
}
 
Верх