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

eevviill

Заблокирован
eevviill, привет, а есть какая-нибудь функция,чтобы MAX_Trades стандартно приделывать? (максимальное ограничение колен в мартинах ограничивать не через Макс.лот или просто число сделок в одну сторону (или даже обе))
Посмотри в моих уроках подсчёт открытых ордеров. Ставишь функцию (ссылку на неё) перед открытием ордера, а потом если бай надо, то

PHP:
CountOpenPositions();

if(buy<Max_orders)
{
OrderSend(...);
}
 

greatiger

Активный участник
Посмотри в моих уроках подсчёт открытых ордеров. Ставишь функцию (ссылку на неё) перед открытием ордера, а потом если бай надо, то

PHP:
CountOpenPositions();

if(buy<Max_orders)
{
OrderSend(...);
}
:oops:
Боюсь я слишком туг и малообразован в MQL,чтобы такое объяснение понять :confused:

А можешь объяснить как в том примере с ММ чуть подробнее :question: в переменные то-то, в условие в основной код то-то, в функции это
 

eevviill

Заблокирован
:oops:
Боюсь я слишком туг и малообразован в MQL,чтобы такое объяснение понять :confused:

А можешь объяснить как в том примере с ММ чуть подробнее :question: в переменные то-то, в условие в основной код то-то, в функции это
Так я же написал.

Ищёшь OrderSend. Пишешь как я написал.
Только с моих уроков функцию скопируй
void CountOpenPoisitions();

Там всё нормально объяснено. Если не поймёшь то объясню ещё раз.
 

greatiger

Активный участник
Так я же написал.

Ищёшь OrderSend. Пишешь как я написал.
Только с моих уроков функцию скопируй
void CountOpenPoisitions();

Там всё нормально объяснено. Если не поймёшь то объясню ещё раз.
int buy,sell,sell_stop,buy_stop;
...

void CountOpenPositions()
{
buy=0;
sell=0;
buy_stop=0;
sell_stop=0;


1)for (int i=OrdersTotal()-1; i>=0; i--)
{
2)OrderSelect(i,SELECT_BY_POS);
{
3)if(OrderMagicNumber()==magic)
{
4)if(OrderType()==OP_BUY) buy++;
if(OrderType()==OP_SELL) sell++;
if(OrderType()==OP_BUYSTOP) buy_stop++;
if(OrderType()==OP_SELLSTOP) sell_stop++;
}
}
}

}
5)

вот эта?
но я ж так все равно не пойму так как нуль(

мне бы как чайнику...

значит заходим в советника
1. В описании переменных в начале пишем "....." (пишем extern double Max_orders=5; ??? например)
2. Ищем int start, вставляем после точки с запятой но перед OrderSend условие?
if(buy<Max_orders)
{
OrderSend(...);

3. Приписываем функцию...
....double ()
{}
...функцию какую-то

я только так догоню( :question:
}

ПС...а как ограничить не только покупку? а все?



ПС2...нашел еще вот
Как сделать виртуальный ТП.
extern int Virtual_TP=24;


double point = 0.0001;

int Start{
...
if(Bid>OrderOpenPrice()+Virtual_TP*point) OrderClose(...);

...
}

а есть стандартные функции как сделать из реального ТП виртуальный? и чтобы в случае проскальзывания или резкого обвала за цену в сторону ТП не ломался алгоритм советника, а все равно закрывал
 
Последнее редактирование:

eevviill

Заблокирован
значит заходим в советника
1. В описании переменных в начале пишем "....." (пишем extern double Max_orders=5; ??? например)
2. Ищем int start, вставляем после точки с запятой но перед OrderSend условие?
if(buy<Max_orders)
{
OrderSend(...);

3. Приписываем функцию...
....double ()
{}
...функцию какую-то



ПС...а как ограничить не только покупку? а все?



ПС2...нашел еще вот

а есть стандартные функции как сделать из реального ТП виртуальный? и чтобы в случае проскальзывания или резкого обвала за цену в сторону ТП не ломался алгоритм советника, а все равно закрывал

1) Пишем в глобальных переменных
PHP:
extern int Max_trades=4;
int buy,sell;
2) Перед ОрдерСенд пишем
PHP:
if(buy<Max_orders)
{ 
OrderSend(...); 
}
3) Перед 2 пишем ссылку на функцию подсчёта ордеров
PHP:
CountOpenPositions();
4) В конце записываем саму функцию.
PHP:
/////////////////////////////////////////////////////////
void CountOpenPositions() 
{ 
buy=0; 
sell=0; 

for (int i=OrdersTotal()-1; i>=0; i--) 
 { 
   OrderSelect(i,SELECT_BY_POS); 
   { 
   if(OrderMagicNumber()==magic) 
   {         
   if(OrderType()==OP_BUY)      buy++;
   if(OrderType()==OP_SELL)     sell++;  
   }               
   } 
 } 

}

P.S.2. buy+sell

P.S.3. Для виртуального ТП и СЛ надо немного язык знать. И оно вообще не нужно.
 

greatiger

Активный участник
Ок спасибо, а как для иланов ввести расширение пипстепа согласно заданному коэффициенту...там обычно во всех пипстеп есть настраиваемый...а сделать бы коэффициент пипстепа...например 1.2 при значении 40 расширлся бы каждое колено 48 57 и тд или при значении 0.9 сужался бы с каждым коленом до 36...33 и т.д...

есть какая-нибудь стандартная функция, чтобы такое приделывать?)
 

eevviill

Заблокирован
Ок спасибо, а как для иланов ввести расширение пипстепа согласно заданному коэффициенту...там обычно во всех пипстеп есть настраиваемый...а сделать бы коэффициент пипстепа...например 1.2 при значении 40 расширлся бы каждое колено 48 57 и тд или при значении 0.9 сужался бы с каждым коленом до 36...33 и т.д...

есть какая-нибудь стандартная функция, чтобы такое приделывать?)
Нету.
 

Алекc1234

Местный житель
Такой вопрос. Есть такой код
if (OrderType() == OP_BUYSTOP)
{
prof = NormalizeDouble((Bid-OrderOpenPrice()),Digits); }
if ( OrderType()== OP_SELLSTOP)
{
prof = NormalizeDouble((OrderOpenPrice()-Ask),Digits); }
Но в сове нет реакции на эту разницу. Просьба сказать, что сделано не так...
Мне нужно, чтобы эта разница была в пунктах...
 
Последнее редактирование:

Ugar

Гуру форума
Такой вопрос. Есть такой код
if (OrderType() == OP_BUYSTOP)
{
prof = NormalizeDouble((Bid-OrderOpenPrice()),Digits); }
if ( OrderType()== OP_SELLSTOP)
{
prof = NormalizeDouble((OrderOpenPrice()-Ask),Digits); }
Но в сове нет реакции на эту разницу. Просьба сказать, что сделано не так...
Мне нужно, чтобы эта разница была в пунктах...
Раздели на Point что бы получить результат в пунктах.
prof = NormalizeDouble((Bid-OrderOpenPrice()),Digits)/Point;
 

eevviill

Заблокирован
Раздели на Point что бы получить результат в пунктах.
prof = NormalizeDouble((Bid-OrderOpenPrice()),Digits)/Point;
Или так. Но не в пунктах.

PHP:
double prof=0;
for(int it=0; it<=OrdersTotal(); it++)
 {
 if(OrderSelect(it,SELECT_BY_POS))
 {
 if(OrderMagicNumber()==magic)
 {
 if(OrderType()==OP_BUY)
 {
prof+=OrderProfit()+OrderSwap()+OrderCommission();   
 }
 }
 }
 }
 

Алекc1234

Местный житель
Или так. Но не в пунктах.

PHP:
double prof=0;
for(int it=0; it<=OrdersTotal(); it++)
 {
 if(OrderSelect(it,SELECT_BY_POS))
 {
 if(OrderMagicNumber()==magic)
 {
 if(OrderType()==OP_BUY)
 {
prof+=OrderProfit()+OrderSwap()+OrderCommission();   
 }
 }
 }
 }

Интересный вариант. Мне пригодится. А то же самое возможно в пунктах сделать?
Только по моему эта строчка здесь лишняя
if(OrderType()==OP_BUY)
Или я не прав?
 
Последнее редактирование:

Ugar

Гуру форума
Или так. Но не в пунктах.

PHP:
double prof=0;
for(int it=0; it<=OrdersTotal(); it++)
 {
 if(OrderSelect(it,SELECT_BY_POS))
 {
 if(OrderMagicNumber()==magic)
 {
 if(OrderType()==OP_BUY)
 {
prof+=OrderProfit()+OrderSwap()+OrderCommission();   
 }
 }
 }
 }
А при чём тут прибыль в валюте? Там была разница между ценой и ценой открытия отложенного ордера. Просто надо было перевести в пункты.
 

Алекc1234

Местный житель
А при чём тут прибыль в валюте? Там была разница между ценой и ценой открытия отложенного ордера. Просто надо было перевести в пункты.

Да, тут Вы правы. Но и по профиту я тоже пробую ставить условие, так что мне интересны оба варианта. Скажите, по Вашему варианту ведь эта строчка тоже обязательна
if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS)) {
 

eevviill

Заблокирован
Интересный вариант. Мне пригодится. А то же самое возможно в пунктах сделать?
Только по моему эта строчка здесь лишняя
if(OrderType()==OP_BUY)
Или я не прав?
Ну это будет считатся профит только по бай ордерам. Можно и по нескольким типам.
PHP:
 if(OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYSTOP)
А ещё можна добавить проверку на соответсвие символа.
PHP:
if(OrderSymbol()==Symbol())
 

Алекc1234

Местный житель
Ну это будет считатся профит только по бай ордерам. Можно и по нескольким типам.
PHP:
 if(OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYSTOP)
А ещё можна добавить проверку на соответсвие символа.
PHP:
if(OrderSymbol()==Symbol())

Спасибо. А можно как-то сделать, чтоб написать прибыль в пунктах?
 

Ugar

Гуру форума
Да, тут Вы правы. Но и по профиту я тоже пробую ставить условие, так что мне интересны оба варианта. Скажите, по Вашему варианту ведь эта строчка тоже обязательна
if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS)) {
Если используется OrderOpenPrice() то перед этим обязательно надо выбрать ордер, иначе от куда программа узнает какого именно ордера надо цену открытия.
Эта строчка и есть выбор ордера, только она не полная.
При использовании параметра SELECT_BY_POS нужно обязательно указывать среди каких ордеров искать, открытых или исторических.
Вот так должна выглядеть эта строчка:
if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS, MODE_TRADES)) {
 

eevviill

Заблокирован
Всё, вопрос пока снимается. Вроде всё получилось. Спасибо всем.
И ещё. Очень помагает Alert();
Вот если бы ты после своего примера поставил Alert(prof);
То увидел бы что у тебя примерно так 0.0078, и понятно сразу что это надо поделить на Point.
 
Верх