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

romwfx

Интересующийся
Почему данный код для запрета открытия новой серии ордеров - раньше срабатывал, а сейчас - не срабатывает? В чем дело и что исправить, чтобы этот код срабатывал в советнике?
PHP:
Expand Collapse Copy
extern bool StopAfterTP=false;
bool trade=false, stop=true;
В начале функции OnTick():
PHP:
Expand Collapse Copy
 if(StopAfterTP)
     {
      stop=true;
      for(int i=0; i<OrdersTotal(); i++) if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==_Symbol) {stop=false; break;}
      if(!stop && !trade) trade=true;
      if(trade && stop) return;
     }
     else trade=false;
 

AlexeNP

Гуру форума
Почему данный код для запрета открытия новой серии ордеров - раньше срабатывал, а сейчас - не срабатывает? В чем дело и что исправить, чтобы этот код срабатывал в советнике?
PHP:
Expand Collapse Copy
extern bool StopAfterTP=false;
bool trade=false, stop=true;
В начале функции OnTick():
PHP:
Expand Collapse Copy
 if(StopAfterTP)
     {
      stop=true;
      for(int i=0; i<OrdersTotal(); i++) if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==_Symbol) {stop=false; break;}
      if(!stop && !trade) trade=true;
      if(trade && stop) return;
     }
     else trade=false;
ну, наверное дело в том, что...
extern bool StopAfterTP=false;
а после
if(StopAfterTP)
в смысле
if(StopAfterTP==true)
для меня вообще говоря загадка - зачем вы пишете сокращенный код, если сами свой же код не понимаете?
 

ivansss

Новичок форума
Добрый день. Буду рад помощи:
имеется такая конструкция: if(StringFind(PositionGetString(POSITION_COMMENT),"from") == -1)
Конструкция проверяет наличие комментария у ордера. Вопрос, как записать комментарий в ордер, чтобы он не прошел это условие. Язык mql5
 

AlexeyVik

Программист mql4 mql5
Добрый день. Буду рад помощи:
имеется такая конструкция: if(StringFind(PositionGetString(POSITION_COMMENT),"from") == -1)
Конструкция проверяет наличие комментария у ордера. Вопрос, как записать комментарий в ордер, чтобы он не прошел это условие. Язык mql5
Комментарий ордера записывается в момент открытия позиции и не может быть изменён со стороны клиента. Что касается "from" я не очень уверен, что комментарий меняется на стороне сервера в момент частичного закрытия. Ведь тикет позиции при частичном закрытии не меняется. Поэтому смысла в этом комментарии нет никакого, в отличии от mql4. А такое условие говорит о том, что комментарий не имеет текста "from" а не просто наличие комментария. Может тебе лучше проверить вообще отсутствие комментария так if(PositionGetString(POSITION_COMMENT) == "")
 

Ugar

Гуру форума
Добрый день. Буду рад помощи:
имеется такая конструкция: if(StringFind(PositionGetString(POSITION_COMMENT),"from") == -1)
Конструкция проверяет наличие комментария у ордера. Вопрос, как записать комментарий в ордер, чтобы он не прошел это условие. Язык mql5
Конкретно эта строчка не проверяет наличие комментария, а ищет в комментарии "from". Если не нахлдит то результат истина. Если находит, то лож.
 

ivansss

Новичок форума
Комментарий ордера записывается в момент открытия позиции и не может быть изменён со стороны клиента. Что касается "from" я не очень уверен, что комментарий меняется на стороне сервера в момент частичного закрытия. Ведь тикет позиции при частичном закрытии не меняется. Поэтому смысла в этом комментарии нет никакого, в отличии от mql4. А такое условие говорит о том, что комментарий не имеет текста "from" а не просто наличие комментария. Может тебе лучше проверить вообще отсутствие комментария так if(PositionGetString(POSITION_COMMENT) == "")
//+-----------------------------------------------------------------------------+
//| Частичное закрытие |
//+-----------------------------------------------------------------------------+
void Particle_close_position()
{
ulong ticket;int tickets;
double min_lot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double step_lot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);

double lots; double price;
ArrayResize(data.ticket,PositionsTotal());
ArrayResize(data.lev,PositionsTotal());
int step = 1;

for ( int i = PositionsTotal()-1; i>=0; i--)
{
if((ticket=PositionGetTicket(i)) == 0) continue;
if(PositionGetInteger(POSITION_MAGIC) != MagicNumber ) continue;
if(StringCompare(PositionGetString(POSITION_SYMBOL), _Symbol)!=0) continue;
if(StringFind(PositionGetString(POSITION_COMMENT),"from") == -1)
{
data.ticket = ticket;
data.lev = 0;
}
}


for (int i = PositionsTotal()-1; i >= 0; i--)
{
if(PositionSelectByTicket(data.ticket))
{
tickets = data.ticket;
double Res = FindPosition(tickets);
if(Res == -1)continue;

if(data.lev == 0)
{
if((PositionGetDouble(POSITION_VOLUME)*0.33) < min_lot){lots = min_lot;}
else lots = MathCeil(PositionGetDouble(POSITION_VOLUME)*0.33/step_lot)*step_lot;

double op = PositionGetDouble(POSITION_PRICE_OPEN);
double cp = PositionGetDouble(POSITION_PRICE_CURRENT);

if(MathAbs(op-cp) > Res*_Point)
{
ExtTrade.PositionModify(data.ticket,NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)),PositionGetDouble(POSITION_TP));
PrintFormat("Ордер № %I64d переведен в безубыток",data.ticket);
ExtTrade.PositionClosePartial(data.ticket,lots);
PrintFormat("Ордер № %I64d зафиксирован на 1/3%",data.ticket);
CleanPositions();
}

ticket = ExtTrade.ResultOrder();
if(ticket > 0)
{
data.lev+=step;
data.ticket = ticket;
break;
}
else
{
data.ticket = -1;
data.lev = -1;
}
}


//--------------------------------------------------------+
if(data.lev == 1 && (PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP) > AccountInfoDouble(ACCOUNT_BALANCE)*(Risk/500)))
{
ExtTrade.PositionClosePartial(data.ticket,lots);
PrintFormat("Ордер № %I64d зафиксирован еще на 50%",data.ticket);
ticket = ExtTrade.ResultOrder();
if(ticket > 0)
{
data.lev+=step;
data.ticket = ticket;
break;
}}
}}
}







После того, как data.lev стал равен 1, должен выполнятся последний блок функции. В mql4 все работало прексрасно, в mql5 нет. В начале каждого вызова функции происходит обнуление data.lev для каждого тикета.
 

ivansss

Новичок форума
Комментарий ордера записывается в момент открытия позиции и не может быть изменён со стороны клиента. Что касается "from" я не очень уверен, что комментарий меняется на стороне сервера в момент частичного закрытия. Ведь тикет позиции при частичном закрытии не меняется. Поэтому смысла в этом комментарии нет никакого, в отличии от mql4. А такое условие говорит о том, что комментарий не имеет текста "from" а не просто наличие комментария. Может тебе лучше проверить вообще отсутствие комментария так if(PositionGetString(POSITION_COMMENT) == "")
Как добавить к тикету комментарий, чтобы потом проверить его отсутсвие?
 

AlexeyVik

Программист mql4 mql5
Как добавить к тикету комментарий, чтобы потом проверить его отсутсвие?
Комментарий в mql5 вставляется так-же как и в mql4 только при открытии позиции.
Вот этот код
C:
Expand Collapse Copy
   if(StringFind(PositionGetString(POSITION_COMMENT), "from") == -1)
     {
      data.ticket = ticket;
      data.lev = 0;
     }
должен отсеивать частично закрытые позиции. Но в mql5 это не работает. В mql5 это делается чуток посложней. Надо выбрать список ордеров и сделок по ID позиции
C++:
Expand Collapse Copy
bool  HistorySelectByPosition(
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER
   );
Затем получить список ордеров
C++:
Expand Collapse Copy
int  HistoryOrdersTotal();
и перебрать ордера в цикле, если ордеров больше одного. Можно проверить размеры лотов и типы ордеров. Если позиция BUY а ордер встретился SELL то это точно закрытие. А учитывая факт, что позиция не закрыта, то с уверенностью можно сказать, что закрыта только часть позиции.
 

Ugar

Гуру форума
должен отсеивать частично закрытые позиции. Но в mql5 это не работает. В mql5 это делается чуток посложней.
В МТ5 есть брокеры и счета где все сделки по символу суммируются в одну позицию. Они же могут частично закрывать позицию. Да в МТ4 после частичного закрытия у позиции может поменяться тикет. Но не у всех брокеров. У некоторых позиция с изначальным тикетом уходит в историю, а появляется с новым тикетом. А у некоторых позиция с изначальным тикетом остаётся открыта, а в историю уходит с новым тикетом.
Но это не всё. Часто брокеры работющие по Российскому законодательству, ночью выполняют закрытие позиции и на её месте открытие новой. Иначе придётся платить % клиенту за открытую позицию больше суток. Так вот после переоткрытия в комментарии новой позиции есть отметка о предыдущей. Давно я не имел дело с такими, не помню точно, но возможно "from" может означать это.
 

AlexeyVik

Программист mql4 mql5
В МТ5 есть брокеры и счета где все сделки по символу суммируются в одну позицию. Они же могут частично закрывать позицию. Да в МТ4 после частичного закрытия у позиции может поменяться тикет. Но не у всех брокеров. У некоторых позиция с изначальным тикетом уходит в историю, а появляется с новым тикетом. А у некоторых позиция с изначальным тикетом остаётся открыта, а в историю уходит с новым тикетом.
Но это не всё. Часто брокеры работющие по Российскому законодательству, ночью выполняют закрытие позиции и на её месте открытие новой. Иначе придётся платить % клиенту за открытую позицию больше суток. Так вот после переоткрытия в комментарии новой позиции есть отметка о предыдущей. Давно я не имел дело с такими, не помню точно, но возможно "from" может означать это.
Суда по тому, что это попытка переделать советник из mql4 в mql5, то можно с очень большой вероятностью сказать, что счёт hadge и соответственно позиции не суммируются. Всё остальное... Андрей ну будь реалистом, когда по ночам переоткрывались ордера? Я в программировании mql4 больше 10-ти лет и такого не встречал. И по тикетам частичного или встречного закрытия однозначно ордер «меняет» тикет и в комментарии проставляется на стороне сервера сообщение, что этот ордер является порождением манипуляций с ордером *** отсюда и запись «from ***» где должны быть квадратные скобки не помню, потому и не поставил. А в МТ5 и соответственно в mql5 тикет позиции не меняется до конца её жизни. То-есть родилась под таким номером, под таким номером и сдохла. Исключения бывают при перевороте позиции. Но это уже биржа и соответственно netting счёт.
 

Ugar

Гуру форума
Андрей ну будь реалистом, когда по ночам переоткрывались ордера? Я в программировании mql4 больше 10-ти лет и такого не встречал. И по тикетам частичного или встречного закрытия однозначно ордер «меняет» тикет и в комментарии проставляется на стороне сервера сообщение, что этот ордер является порождением манипуляций с ордером *** отсюда и запись «from ***» где должны быть квадратные скобки не помню, потому и не поставил.
А я встречал. И переоткрытие ордера по ночам, даже на форекс, правда давно. И 2 варианта частичного закрытия. В одном менялся тикет открытого ордера, в другом тикет закрытого был уникальным, а открытый не менялся. Мне приходилось из за этого переделывать свой советник так как по другому выполнялось частичное закрытие. И даже встречал брокера, который сначала одним способом выполнял частичное закрытие, потом другим.
А в МТ5 и соответственно в mql5 тикет позиции не меняется до конца её жизни. То-есть родилась под таким номером, под таким номером и сдохла. Исключения бывают при перевороте позиции. Но это уже биржа и соответственно netting счёт.
На moex например, конечно же там netting. Но там и переоткрытие позиций каждый день. Не помню точно, может даже днём. На этом форуме большинство торгуют валютами и через офшорные ДЦ. Но попадаются и те кто на бирже торгуют.

Если конечно советник переписывался с mql4, возможно from в комментарии просто не убрали, так как не мешал.
 

ivansss

Новичок форума
и перебрать ордера в цикле, если ордеров больше одного. Можно проверить размеры лотов и типы ордеров. Если позиция BUY а ордер встретился SELL то это точно закрытие. А учитывая факт, что позиция не закрыта, то с уверенностью можно сказать, что закрыта только часть позиции.

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

AlexeyVik

Программист mql4 mql5
Нифига не понятно. ID ордера меняется при частичном закрытии?. ID тогда можно было бы привязать к тикету.
Ты хоть документацию открыл-бы.
POSITION_IDENTIFIERИдентификатор позиции - это уникальное число, которое присваивается каждой вновь открытой позиции и не изменяется в течение всей ее жизни. Соответствует тикету ордера, которым была открыта позиция.

Идентификатор позиции указывается в каждом ордере (ORDER_POSITION_ID) и сделке (DEAL_POSITION_ID), которая ее открыла, изменила или закрыла. Используйте это свойство для поиска ордеров и сделок, связанных с позицией.

При развороте позиции в режиме неттинга (единой сделкой in/out) идентификатор позиции POSITION_IDENTIFIER не изменяется. Однако при этом POSITION_TICKET изменяется на тикет ордера, в результате которого произошел разворот. В режиме хеджинга разворот позиции не предусмотрен.
long
В недавней редакции документации была оговорка: Как правило соответствует тикету ордера, которым была открыта позиция. Теперь эту оговорку убрали. Значит соответствует всегда, но лично я предпочитаю перестраховаться и не использовать тикет, а получить именно ID позиции.
C++:
Expand Collapse Copy
long  PositionGetInteger(
   ENUM_POSITION_PROPERTY_INTEGER  property_id      // идентификатор свойства
   );
 

ivansss

Новичок форума
Ты хоть документацию открыл-бы.
Не ищу легких путей. :) В целом, как то не додумался в справку залезть.

Значит соответствует всегда
Чем мне тогда ID поможет я хоть убей не понимаю. Моя задача не обнулить data.lev после того, как произошло частичное закрытие. Про лотность, если я правильно вас понял, я должен создать какой data.lots и записать туда до закрытия размер ордера. После частичного закрытия я смогу на основе лотности отсеивать. Верно?



for ( int i = PositionsTotal()-1; i>=0; i--)
{
if((ticket=PositionGetTicket(i)) == 0) continue;
if(PositionGetInteger(POSITION_MAGIC) != MagicNumber ) continue;
if(StringCompare(PositionGetString(POSITION_SYMBOL), _Symbol)!=0) continue;
if(StringFind(PositionGetString(POSITION_COMMENT),"from") == -1)
{
data.ticket = ticket;
data.lev = 0;
}
}
 

MrGreen86

Гуру форума
я предпочитаю перестраховаться и не использовать тикет, а получить именно ID позиции.
C++:
Expand Collapse Copy
long  PositionGetInteger(
   ENUM_POSITION_PROPERTY_INTEGER  property_id      // идентификатор свойства
   );
правильно делаете, потому что нихрена она не соответствует ) не помню где именно, но в каких то условиях тикет менялся, а ID оставался прежним. Вроде при клиринге.
 

AlexeyVik

Программист mql4 mql5
правильно делаете, потому что нихрена она не соответствует ) не помню где именно, но в каких то условиях тикет менялся, а ID оставался прежним. Вроде при клиринге.
Не надо путать тикет ордера которым была открыта позиция и тикет позиции.
 

AlexeyVik

Программист mql4 mql5
Не ищу легких путей. :) В целом, как то не додумался в справку залезть.


Чем мне тогда ID поможет я хоть убей не понимаю. Моя задача не обнулить data.lev после того, как произошло частичное закрытие. Про лотность, если я правильно вас понял, я должен создать какой data.lots и записать туда до закрытия размер ордера. После частичного закрытия я смогу на основе лотности отсеивать. Верно?
Писать кусок кода я не буду. Что надо сделать я описа́л в сообщении 7608. Пилите Шура, пилите...
 
Верх