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

Ugar

Гуру форума
Приветствую всех!

Вопрос такой: для быстрого тестирования и оптимизации (по ценам открытия) советник должен использовать PRICE_OPEN или PRICE_CLOSE в коде ???
Сова не использует TP и SL. Закрытие происходит по общему профиту (усреднение).

p.s. простите, запутался с инфой немного, только учусь))
Ни то не другое. Что бы тестировать по ценам открытия, советник должен выполнять все действия только в моменты открытия баров. Если Закрытие происходит по общему профиту происходит в момент достижения этого профита, то не подходит. Вот если он будет проверять общий профит только в моменты открытия баров и если достиг заданного закрывать в этот момент, тогда это подходит. Конечно, ещё и открытие и модификации ордеров, и опрос индикаторов, в общем всё, должно происходить в моменты открытия нового бара.
 

Petr888

Заблокирован
Ни то не другое. Что бы тестировать по ценам открытия, советник должен выполнять все действия только в моменты открытия баров. Если Закрытие происходит по общему профиту происходит в момент достижения этого профита, то не подходит. Вот если он будет проверять общий профит только в моменты открытия баров и если достиг заданного закрывать в этот момент, тогда это подходит. Конечно, ещё и открытие и модификации ордеров, и опрос индикаторов, в общем всё, должно происходить в моменты открытия нового бара.

Спасибо за пояснения,
еще я использую во такой блок:

if(orders_modifi)
{
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
}

насколько я понял, то открытие ордера и последующая модификация происходят именно в моменты открытия нового бара, не так ли? правильно?

Time[0] - здесь [0] это нулевой бар, который открылся, верно?
 
Последнее редактирование:

vladradon

Программист
Приветствую всех!

Вопрос такой: для быстрого тестирования и оптимизации (по ценам открытия) советник должен использовать PRICE_OPEN или PRICE_CLOSE в коде ???
Сова не использует TP и SL. Закрытие происходит по общему профиту (усреднение).

p.s. простите, запутался с инфой немного, только учусь))

Ускорить тестирование и оптимизацию вряд ли получится: эти параметры, насколько я понял, задаются в индикаторе для открытия ордеров или для каких-то математических расчетов, но это равнозначные параметры и от их перемены ничего не изменится, учитывая то, что выход происходит по общему ТР, который должен расчитываться независимо от параметров входа PRICE_OPEN или PRICE_CLOSE. Просто при усреднении эти параметры не могут влиять на расчет общего профита, а влияет только суммарное значение профитов всех ордеров, которые связаны только с текущей ценой графика.
 

vladradon

Программист
Спасибо за пояснения,
еще я использую во такой блок:

if(orders_modifi)
{
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
}

насколько я понял, то открытие ордера и последующая модификация происходят именно в моменты открытия нового бара, не так ли? правильно?

Time[0] - здесь [0] это нулевой бар, который открылся, верно?
Судя по всему, запускается модификация ордера, но к открытию ордеров скорее всего отношения не имеет и еще - это функция, Вами выложенная, на проверку открытия нового бара - на сравнение времени открытия последнего открытого бара с текущим, и если разница есть, то по смыслу должны выполняться дальше по коду функции, либо происходит перезапуск функции Start. Но не зная всего кода - это ориентировочные предположение - может у Вас код навороченный и в нем еще нужно поискать, куда что воткнуть.)))
Time[0] - это время открытия нулевого бара.
 
Последнее редактирование:

Petr888

Заблокирован
Судя по всему, запускается модификация ордера, но к открытию ордеров скорее всего отношения не имеет и еще должна быть в коде проверка (это функция на проверку открытия нового бара) на сравнение времени открытия последнего открытого бара с текущим и если разница есть, то по смыслу должны выполняться дальше по коду функции, либо происходит перезапуск функции Start. Но не зная всего кода - это ориентировочные предположение - может у Вас код навороченный и в нем еще нужно поискать, куда что воткнуть.)))

Если эта функция включена т.е. TRUE, то ордера открываются, а так же модифицируются только после открытия нового бара. Если отключена, то по тикам
 

Petr888

Заблокирован
Ускорить тестирование и оптимизацию вряд ли получится: эти параметры, насколько я понял, задаются в индикаторе

Я вот и хотел узнать, Во вшитых в советник индикаторах что лучше использовать PRICE_OPEN или PRICE_CLOSE.

Мне этот момент пока непонятен))

индикаторы самые простые, из набора MT4: AO и AC
 

vladradon

Программист
Если эта функция включена т.е. TRUE, то ордера открываются, а так же модифицируются только после открытия нового бара. Если отключена, то по тикам
Значит в самом коде, как я и предположил, эта функция регулирует сразу весь код и делает сброс выполнения всего кода при ее включении, если не наступило открытие нового бара. Скорее всего нужно весь код грамотно разграничить - чтобы индикаторы работали по тику или по открытию бара, а все функции закрытия по профиту или модификации - по тику. Я так буду долго гадать, не зная расположения Ваших функций в коде.
 

vladradon

Программист
Я вот и хотел узнать, Во вшитых в советник индикаторах что лучше использовать PRICE_OPEN или PRICE_CLOSE.

Мне этот момент пока непонятен))

индикаторы самые простые, из набора MT4: AO и AC

Я уже писал выше - это без разницы. Точнее - это уже касательно только настроек индикатора и к коду сова они без разницы.
 

Petr888

Заблокирован
Я уже писал выше - это без разницы. Точнее - это уже касательно только настроек индикатора и к коду сова они без разницы.

Вот так у меня закрываются ордера:

for(cnt=0;cnt<OrdersTotal();cnt++){
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber () == Magic_b){
ticketbuy = OrderTicket();OrderSelect(ticketbuy,SELECT_BY_TICKET, MODE_TRADES);profitbuy = profitbuy+OrderProfit() ;
openpricebuy = OrderOpenPrice();
}
}

tpb = (OrdersTotalMagic_b(Magic_b)*ProfitPips*pp)+openpricebuy;
double bid = MarketInfo(Symbol(),MODE_BID);
if(profitbuy>0 || AccountEquity()>=StopIfEquityOver){
if (Bid>=tpb) orderclosebuy(ticketbuy);
}

/////////////////////////////////////////////////////////////////////////////////////

for(cnt=0;cnt<OrdersTotal();cnt++){
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_s{
ticketsell = OrderTicket();OrderSelect(ticketsell,SELECT_BY_TICKET, MODE_TRADES);profitsell = profitsell+OrderProfit();
openpricesell = OrderOpenPrice();
}
}
tps = openpricesell-(OrdersTotalMagic_s(Magic_s)*ProfitPips*pp);
double ask = MarketInfo(Symbol(),MODE_ASK);
if(profitsell>0 || AccountEquity()>=StopIfEquityOver){
if (Ask<=tps)orderclosesell(ticketsell);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

free = AccountFreeMargin();balance = AccountBalance();
for(cnt=0;cnt< OrdersTotal();cnt++){
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber () == Magic_b) ticketbuy = OrderTicket();
if(OrderSymbol()==Symbol() && OrderMagicNumber () == Magic_s) ticketsell = OrderTicket();
}
if(OrdersTotalMagic_b(Magic_b)==0){
profitbuy=0;ticketbuy=0;tpb=0;
}
if (OrdersTotalMagic_s(Magic_s)==0){
profitsell=0;ticketsell=0;tps=0;
}
 
Последнее редактирование модератором:

vladradon

Программист
Вот так у меня закрываются ордера:

for(cnt=0;cnt<OrdersTotal();cnt++){
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber () == Magic_b){
ticketbuy = OrderTicket();OrderSelect(ticketbuy,SELECT_BY_TICKET, MODE_TRADES);profitbuy = profitbuy+OrderProfit() ;
openpricebuy = OrderOpenPrice();
}
}

tpb = (OrdersTotalMagic_b(Magic_b)*ProfitPips*pp)+openpricebuy;
double bid = MarketInfo(Symbol(),MODE_BID);
if(profitbuy>0 || AccountEquity()>=StopIfEquityOver){
if (Bid>=tpb) orderclosebuy(ticketbuy);
}

/////////////////////////////////////////////////////////////////////////////////////

for(cnt=0;cnt<OrdersTotal();cnt++){
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_s{
ticketsell = OrderTicket();OrderSelect(ticketsell,SELECT_BY_TICKET, MODE_TRADES);profitsell = profitsell+OrderProfit();
openpricesell = OrderOpenPrice();
}
}
tps = openpricesell-(OrdersTotalMagic_s(Magic_s)*ProfitPips*pp);
double ask = MarketInfo(Symbol(),MODE_ASK);
if(profitsell>0 || AccountEquity()>=StopIfEquityOver){
if (Ask<=tps)orderclosesell(ticketsell);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

free = AccountFreeMargin();balance = AccountBalance();
for(cnt=0;cnt< OrdersTotal();cnt++){
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber () == Magic_b) ticketbuy = OrderTicket();
if(OrderSymbol()==Symbol() && OrderMagicNumber () == Magic_s) ticketsell = OrderTicket();
}
if(OrdersTotalMagic_b(Magic_b)==0){
profitbuy=0;ticketbuy=0;tpb=0;
}
if (OrdersTotalMagic_s(Magic_s)==0){
profitsell=0;ticketsell=0;tps=0;
}
Это стандартно. Этот код должен идти перед всем остальным в Старте (функции), потом функция
if(orders_modifi)
{
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
}
И потом функции открытия ордеров. Функции все рабочие, но их нужно в правильной последовательности прописывать в коде! Я только не совсем понял почему переменная orders_modifi так называется: если есть еще какой-то трал или что-то модифицирует ордера в процессе торгов, то это тоже стоит поместить сразу за функциями закрытия.
 
Последнее редактирование модератором:

Petr888

Заблокирован
Это стандартно. Этот код должен идти перед всем остальным в Старте (функции), потом функция
if(orders_modifi)
{
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
}
И потом функции открытия ордеров. Функции все рабочие, но их нужно в правильной последовательности прописывать в коде! Я только не совсем понял почему переменная orders_modifi так называется: если есть еще какой-то трал или что-то модифицирует ордера в процессе торгов, то это тоже стоит поместить сразу за функциями закрытия.

функцию можно обозвать как угодно)) изначально она прописывалась только для выбора модификации ордера: по тикам или по открытию нового бара.

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

vladradon

Программист
функцию можно обозвать как угодно)) изначально она прописывалась только для выбора модификации ордера: по тикам или по открытию нового бара.

насчет последовательности функций в коде - отдельное спасибо. Не знал, что это играет роль)))
У Вас это
if(orders_modifi)
{...
в коде не является отдельной функцией и orders_modifi - это переменная (а не название функции) - это часть оновного кода функции Старт и всего лишь проходной блок, в котором есть перезапуск той функции (Старт) - return(0), в которой этот блок находится.
Функции описываются отдельно - в документации есть все, и они располагаются вне функции Старт. А какой-то отдельный блок той же функции Старт просто выполняется последовательно с остальными командами, и когда наступает return(0), то уже все дальнейшие, после этого команды, не выполняются. Это применительно именно к Вашему коду, если я правильно его понял.
 
Последнее редактирование:

Ugar

Гуру форума
Спасибо за пояснения,
еще я использую во такой блок:

if(orders_modifi)
{
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
}

насколько я понял, то открытие ордера и последующая модификация происходят именно в моменты открытия нового бара, не так ли? правильно?

Time[0] - здесь [0] это нулевой бар, который открылся, верно?
Тут конкретно работает так:
Если orders_modifi=true, то всё что поле этого блока будет выполняться только при открытии нового бара. Всё что прописано до этого блока работает по тиком. Так же, если этот блок отключен orders_modifi=false, то всё выполняется по тиком.
 

vladradon

Программист
Тут конкретно работает так:
Если orders_modifi=true, то всё что поле этого блока будет выполняться только при открытии нового бара. Всё что прописано до этого блока работает по тиком. Так же, если этот блок отключен orders_modifi=false, то всё выполняется по тиком.
Спасибо за доп информацию, но человек сам, как он написал, учится программировать, поэтому дублировать мою инфу нет смысла - я то же самое написал, только в более развернутом формате.
 

Ugar

Гуру форума
Спасибо за доп информацию, но человек сам, как он написал, учится программировать, поэтому дублировать мою инфу нет смысла - я то же самое написал, только в более развернутом формате.
Извините, если чем обидел. Человек задал вопрос с цитатой на мой прошлый ответ. Я по наивности решил, что вопрос мне. Ответить мне не трудно, вот и ответил. Ваши ответы не читал.
 

STELS37

Новичок форума
Ну... ошибок там у тебя куча - это надо вместе по тобой задуманной стратегии в режиме реального времени корректировать - просто даже не совсем понятно, по какой стратегии ты собираешься торговать. Сразу скажу: Внешние переменные не могут меняться в коде - ошибка в строке 83 и получать информацию функциями типа OrderMagicNumber() можно только после выбора открытого ордера после его выбора по номерам позиции или тикета.

Стратегию выбрал по пересечению 2х скользящих средних ( типо если одна више другой то бай) Спасибо за подсказку ! Переписал весь код на учет ордеров и открытие прономтью ... Походу окей все стало. Опыт приходит с ошибками:D
 

Petr888

Заблокирован
Тут конкретно работает так:
Если orders_modifi=true, то всё что поле этого блока будет выполняться только при открытии нового бара. Всё что прописано до этого блока работает по тиком. Так же, если этот блок отключен orders_modifi=false, то всё выполняется по тиком.

Ugar спасибо!

А вот этот момент?

Time[0] - здесь [0] это нулевой бар, который открылся, верно?
 
Верх