Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1174

 
Valeriy Yastremskiy:

OrderSelect по тикету сделан ранее. Ордер отложенный. Каким запросом  получить что ордер стал рыночным, кроме как проверки типа ордера на каждом тике. В логах это время записывается, но получается поля для этого времени в структуре ордера не предусмотрено, или я не прав? При смене типа ордера OrdersTotal(), и OrdersHistoryTotal тоже не изменяются, если правильно понимаю.

С остальным вроде прояснилось)

OrderOpenTime пробовали? я уж не помню меняется ли оно при сработке отложника.

В каких случаях есть необходимость каждый тик (а не перед ключевыми действиями или каждую 1..5.. минут) проверять сработку отложника я не знаю, но другого пути в МТ4 нет.

В МТ5 поудобнее. В ОТТ узнаёшь о проведении транзакции, если надо работать со списками, то проводишь обработку в ОТ

 
datetime some_time=TimeCurrent();

extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)

extern double P=15;       //Таймфрейм

int start()

{

//Инициализация переменных

bool  FractalsUp=false;

bool  FractalsDown=false;

int   FractalsUpPrice=0;

int   FractalsDownPrice=0;

int   FractalsLimit=100;

double EMA=iMA(NULL,P,5,3,MODE_EMA,PRICE_CLOSE,0);

   //Цикл сканирования последних свечей FractalsLimit, начиная с самых старых и заканчивая самыми последними.

   for (int i=FractalsLimit; i>=0; i--)

{

      //Если на свече есть фрактал, значение будет больше нуля и будет равно самой высокой или самой низкой цене.

      double fu=iFractals(NULL,0,MODE_UPPER,i);

      double fl=iFractals(NULL,0,MODE_LOWER,i);

      //Если есть верхний фрактал, я сохраняю значение и устанавливаю true для переменной FractalsUp.

      if(fu>0)

{

FractalsUp=true;

FractalsDown=false;

FractalsUpPrice=fu;



if (((Close[0])>fu)&&(OrdersTotal() == 0)&&(Close[0]>Open[0])&&(Close[0]>High[1]&&(Close[0]>EMA))) 

{  

if ((OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS, MODE_HISTORY)==true))

{

datetime Cd=OrderCloseTime();

int hd=+iBarShift(Symbol3,P,Cd)+1;

if (hd<=2)

{

return(-1);

}

}



metka1();

}

}

//Если есть нижний фрактал, я сохраняю значение и устанавливаю true для переменной FractalsDown.

      if(fl>0)

{

FractalsUp=false;

FractalsDown=true;

FractalsDownPrice=fl;

if (((Close[0])<fl)&&(OrdersTotal() == 0)&&(Close[0]<Open[0])&&(Close[0]<Low[1]&&(Close[0]<EMA))) 

{  

if ((OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS, MODE_HISTORY)==true))

{

datetime Cd1=OrderCloseTime();

int hd1=+iBarShift(Symbol3,P,Cd1)+1;

if (hd1<=2)

{

return(-1);

}

}

metka2();

}

}

      //Если свеча имеет верхний и нижний фрактал, значения сохраняются, но мы не считаем его последним фракталом.

      if(fu>0 && fl>0)

{

         FractalsUp=false;

         FractalsDown=false;

         FractalsUpPrice=fu;        

         FractalsDownPrice=fl;

}

}

return(0);

}

int metka1()

{              

int send1=OrderSend(Symbol3,OP_BUY,0.01,Ask,3,Bid-70*Point,Bid+70*Point);

return(0);

}

int metka2()

{                        

int send2=OrderSend(Symbol3,OP_SELL,0.01,Bid,3,Ask+70*Point,Ask-70*Point);

return(0);

}

Добрый день!

Работаю на совой по фракталам. Есть проблема. Помогите. Суть в чём: 

Скрипт выискивает последний верхний или нижний фрактал из 100 последних свечей переменная   [FractalsLimit=100;]  и открывает позицию BUY - если пробит повышающийся фрактал, и наоборот для SELL. 

А нужно чтобы  - из 100 последних свечей находил максимальный, или минимальный фрактал и с учётом их открывал позицию. То есть ориентировался только на максимальные и минимальные фракталы, а не на последние.

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Aleksey Mavrin:

OrderOpenTime пробовали? я уж не помню меняется ли оно при сработке отложника.

В каких случаях есть необходимость каждый тик (а не перед ключевыми действиями или каждую 1..5.. минут) проверять сработку отложника я не знаю, но другого пути в МТ4 нет.

В МТ5 поудобнее. В ОТТ узнаёшь о проведении транзакции, если надо работать со списками, то проводишь обработку в ОТ

OrderOpenTime показывает время открытия отложки. Вопрос на понимание работы больше. Получается в лог и журнал время записывается и больше нигде не отражается. Соответственно если мы его не зафиксировали, то только потом можем посмотреть, по факту)))))

В МТ5 это будет открытие позиции / сделка, если правильно понимаю. Хоть мне и деление на ордер / сделка / позиция малопонятна как оптимальное решение, но данных больше конечно.

 
Aleksey Mavrin:

бывает и такое)) 1 очень теряется на фоне англ.букв l i и т.п., удобнее называть тогда суффиксы 001, 2.. и т.п.

Я Вас понял) исправил ошибку, теперь значение второго хендла равно 1,0. Если в первом хендле поставить больший таймфрейм, чем во втором, то значение второго хендла равно 0. Подскажите пожалуйста, что нужно еще исправить, чтобы получить верное значение второго хендла?

void OnTick()
  {
   double PriceArray[];
   
   int AOhandle = iAO(_Symbol,PERIOD_M15);
   
   ArraySetAsSeries(PriceArray, true);
   
   CopyBuffer(AOhandle, 0, 0, 3, PriceArray);
   
   double AOvalue = NormalizeDouble(PriceArray[0], 6);

   double PriceArray01[];
   
   int AOhandle01 = iAO(_Symbol,PERIOD_H1);
   
   ArraySetAsSeries(PriceArray01, true);
   
   CopyBuffer(AOhandle01, 1, 0, 3, PriceArray01);
   
   double AOvalue01 = NormalizeDouble(PriceArray01[0], 6);
    
   Comment ("Awesome Oscillator Value: ", AOvalue, "\n", "\n",
            "Awesome Oscillator Value: ", AOvalue01);
  }
 
Valeriy Yastremskiy:

OrderOpenTime показывает время открытия отложки. Вопрос на понимание работы больше. Получается в лог и журнал время записывается и больше нигде не отражается. Соответственно если мы его не зафиксировали, то только потом можем посмотреть, по факту)))))

Вы с неделю этот вопрос поднимаете, предлагал же Вам пересмотреть принципы выставления ордеров в торговой стратегии

но если этот вопрос все же очень Вам важен , вообще не проблема "зафиксировать" с дискретностью в один тик

можно "фиксировать" как делают все новички, в большой массив сохранять тикеты отложенных ордеров и проверять эти тикеты по приходу тика - про скорость уже писал, не критично ни в тестере ни на реале, но будут проблемы - с массивом не удобно, их нудно чистить - это добавит ошибок... 


что хотел бы предложить изучить - СБ CArrayInt https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayint

в CArrayInt  будете добавлять тикеты и этот тип данных позволит Вам без труда удалять "тикеты которые стали рыночными"


как писал выше точность - 1 тик, код по проверке будет минимальный

Valeriy Yastremskiy:

В МТ5 это будет открытие позиции / сделка, если правильно понимаю. Хоть мне и деление на ордер / сделка / позиция малопонятна как оптимальное решение, но данных больше конечно.

если можете писать под МТ5 - тогда к чему разговор? пишите, платформа боле мощная, функционал выше - сравнивать МТ4 и МТ5 нет смысла, в МТ4 проще войти, но в МТ5 больше возможностей

 
Igor Makanu:

Вы с неделю этот вопрос поднимаете, предлагал же Вам пересмотреть принципы выставления ордеров в торговой стратегии


Осталось не понятным. Стратегия конечно другая. Вопрос возник от того, что достаточно важное событие отражается только в логе. И никто напрямую не ответил, что нет нигде кроме лога времени, когда ордер стал рыночным))))

А логика стратегии от терминала не зависит. Если логика хромает, то наоптить можно конечно, но прихрамываение не уберется))))

 
Valeriy Yastremskiy:

Осталось не понятным. Стратегия конечно другая. Вопрос возник от того, что достаточно важное событие отражается только в логе. И никто напрямую не ответил, что нет нигде кроме лога времени, когда ордер стал рыночным))))

нет этой информации - нетуууу!!!

важность... ну Вам важно, до этого сколько лет писали стратегии и как бы получалось, даже в профит ;)

обычно не сопровождают много отложенных ордеров, следят за рыночными ордерами, при необходимости добавляют отложенный - стал рыночным еще отложенный

пишется все и усреднение и пирамилинг и сетки ордеров и ... и локи... да не помню уже, этих выкрутасов по форумам трейдеров нужно почитать, не читаю с год - мыслей своих больше теперь чем чужих )))

 
Igor Makanu:

нет этой информации - нетуууу!!!

важность... ну Вам важно, до этого сколько лет писали стратегии и как бы получалось, даже в профит ;)

обычно не сопровождают много отложенных ордеров, следят за рыночными ордерами, при необходимости добавляют отложенный - стал рыночным еще отложенный

пишется все и усреднение и пирамилинг и сетки ордеров и ... и локи... да не помню уже, этих выкрутасов по форумам трейдеров нужно почитать, не читаю с год - мыслей своих больше теперь чем чужих )))

Спасибо))))

Мартин и усреднение это самообман и запредельный (потому что ни просчитать, ни спрогнозировать риск нельзя по определению свойств ВР))))) риск, который иногда, но только иногда, оправдывается))))

Если стратегия верная, то хватит и одного ордера))))

 
Valeriy Yastremskiy:

Если стратегия верная, то хватит и одного ордера))))

если в Вашей ТС жестко задано количество ордеров, то у Вас не должно быть проблем с определением, что произошло на текущем тике с отложенными ордерами

знание точного времени ничего не даст - вся информация все равно поступает по приходу тика - нет тика нет информации

 

Здравствуйте! Столкнулся с проблемой, как изменить параметры пользовательского индикатора из советника. Проблема в том что при изменении любого параметра в списке индикаторов создается его новая копия, когда заходишь в свойства этих копий то каждая копия со своим параметром. Чем больше я меняю разных значений параметра столько разных копий и создается. Использую через iCustom.

Например:

#resource "\\Indicators\\inicator.ex4"

extern int Var1=1;

//------------------------------------------

void OnTick()

  {

int A;   

Var1++;

   A=iCustom(Symbol(),PERIOD_CURRENT,"::Indicators\\indicator",Var1,0,0);

В итоге в списке индикаторов видим:

Indicator (с параметром Var1=2)

Indicator (с параметром Var1=3)

Indicator (с параметром Var1=4)

.... и т.д.


Причина обращения: