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

 

добрый день, Господа. )) прошу прощения за дилетантство..

не понимаю как работает OrderClose :(

мне нужно чтобы был максимум 1 ордер. то есть перед открытием нового, чтобы предыдущий закрылся..

почему так не работает? 


OrderClose(nom, 0.01, Bid,5, Red);

OrderSend(Symbol(), OP_SELL, 0.01 , NormalizeDouble(Bid,5), 3 , NormalizeDouble(Ask+0.0005,5), NormalizeDouble(Bid-0.0008,5), "", nom,0,Red);


журнал в основном ругается на неверный Ticket .. 

в OrderClose вместо nom, что вставлять нужно? или я вообще не в том направлении думаю?))

 
Sergey Voytsekhovsky:

Попробуйте минСтопЛосс = Текущая цена +/- (МаксЗначение(2*Спред, СтопЛэвэл));

Побовал. Два спреда это 24,  так работать не будет, начинает работать на 19 от цены закрытия. От текущей цены открытия работает при трёх спредах.
Я в цикле увеличивал стоп на один пункт и открывал ордер. На 19 открыло. Вопрос же не в том как подобрать. Вопрос в том как правильно рассчитать. Нет цен, ведь появляется и при ручном открытии ордера, если стоп устанавливать кнопкой. Бред какой то.  Сейчас занимаюсь массовым почтением всего форума подряд. На 7-й странице (сообщение #65) нашел какие то функции. Как проверю, отпишусь.

 
Sergey Voytsekhovsky:

Изучил, ничего нового не почерпнул, видимо оно (новое для меня) конечно есть, очевидное для всех посвященных, само собой разумеющееся. Найти я не смог, кроме  вышеописанной особенности взаимного расположения буферов при индексировании. Эту последовательность соблюл, получил еще более убогую картинку. 

Картинки ниже, фал приложен

Может вам очень не повезло, но я не люблю колупаться в чужом коде. Тем более править его...

Следующий вопрос: Как вы думаете как часто значение индикатора будет равно ровно 50?

         ColorHistogram_2Buffer1[i]=50; 

Как я понял задачу, то должно быть одного цвета >50 и другого цвета <50 а вот ==50 нигде не видел. Конечно чтобы исключить потерю в случае если == 50, надо к одному из сравнений добавить >=50 или другому <=50 Это уже как религия позволяет. Как будет красивей выглядеть.

И второй вопрос: на сколько была необходимость менять всю индексацию буферов? После переиндексации вы точно всё в коде исправили? Может проще было-бы буфер цвета назначить индексом 4, а вспомогательные буферы 5 и 6 соответственно. Меньше пришлось-бы править и меньше вероятность допустить ещё несколько ошибок.

 
klok79:
Побовал. Два спреда это 24,  так работать не будет, начинает работать на 19 от цены закрытия. От текущей цены открытия работает при трёх спредах.
Я в цикле увеличивал стоп на один пункт и открывал ордер. На 19 открыло. Вопрос же не в том как подобрать. Вопрос в том как правильно рассчитать. Нет цен, ведь появляется и при ручном открытии ордера, если стоп устанавливать кнопкой. Бред какой то.  Сейчас занимаюсь массовым почтением всего форума подряд. На 7-й странице (сообщение #65) нашел какие то функции. Как проверю, отпишусь.

Проверил. Работает
Странно это все, там написаны все те же минСтопЛосс = Текущая цена +/- (МаксЗначение(2*Спред, СтопЛэвэл)), только под Текущей ценой понимается не цена открытия ордера, а зеркальная цена.
Почему двойной спред подходит ?
Еще возникает два вопроса.
1. Почему для получения значений Digits() и Point(); используется SymbolInfoInteger ?
2. Зачем используется запись (int) перед вызовом функции SymbolInfoInteger? Как я понял это принудительное приведение типов.

 
klok79:

Проверил. Работает
Странно это все, там написаны все те же минСтопЛосс = Текущая цена +/- (МаксЗначение(2*Спред, СтопЛэвэл)), только под Текущей ценой понимается не цена открытия ордера, а зеркальная цена.
Почему двойной спред подходит ?
Еще возникает два вопроса.
1. Почему для получения значений Digits() и Point(); используется SymbolInfoInteger ?
2. Зачем используется запись (int) перед вызовом функции SymbolInfoInteger? Как я понял это принудительное приведение типов.

Для получения Point() SymbolInfoInteger никак не подойдёт.)))

А вообще, это необходимо для того, чтобы не забывать, что Point() или _Point только для текущего символа. Для символов отличных от того на котором работает советник нужно использовать именно эту функцию.

Функция SymbolInfoInteger возвращмет не только int значения, но и long, и bool, и перечисления.

 

Sergey Voytsekhovsky, спасибо за помощь. И еще один вопрос, если не сложно, подскажите функцию, обратную функции CharToStr
(Чтобы из символа получит его код) , а то я пришел из Бейсика и Дельфи, там есть функции для этого, а в С++, я так понял есть два метода:
1 - Функция ascii_cod, которой нет в mql4
2. - Прямое приведение типов. Но у меня почему то код 
string st="A";
Print ("Код символа А=",(int)st);

Выводит текст Код символа А=0.

Как быть?

 
klok79:

Sergey Voytsekhovsky, спасибо за помощь. И еще один вопрос, если не сложно, подскажите функцию, обратную функции CharToStr
(Чтобы из символа получит его код) , а то я пришел из Бейсика и Дельфи, там есть функции для этого, а в С++, я так понял есть два метода:
1 - Функция ascii_cod, которой нет в mql4
2. - Прямое приведение типов. Но у меня почему то код 
string st="A";
Print ("Код символа А=",(int)st);

Выводит текст Код символа А=0.

Как быть?

StringToCharArray в отличии от ваиковой функции преобразует не только по одному символу, а может преобразовать строку в массив типа ucar коды всех символов строки.

В mql4 такая функция тоже есть.

Документация по MQL5: Преобразование данных / StringToCharArray
Документация по MQL5: Преобразование данных / StringToCharArray
  • www.mql5.com
Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов. [in]  Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо...
 
Alexey Viktorov:

Для получения Point() SymbolInfoInteger никак не подойдёт.)))

А вообще, это необходимо для того, чтобы не забывать, что Point() или _Point только для текущего символа. Для символов отличных от того на котором работает советник нужно использовать именно эту функцию.

Функция SymbolInfoInteger возвращмет не только int значения, но и long, и bool, и перечисления.

Ну вообще-то Point имеет значение double. Значит и запрос нужно делать SymbolInfoDouble

 
Konstantin Nikitin:

Ну вообще-то Point имеет значение double. Значит и запрос нужно делать SymbolInfoDouble

Там речь идёт об этих функциях для MQL4 из поста #65:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+

Я не увидел, где тут Point получается через SymbolInfoInteger()

 
Artyom Trishkin:

Там речь идёт об этих функциях для MQL4 из поста #65:

Я не увидел, где тут Point получается через SymbolInfoInteger()

Да о том-же. Ладно проскочили. Главное чтоб он понял что к чему...

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