[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 774

 
drknn:

НЕ че не пойму у меня есть такая строка в открытии рыночного ордера, копирую ее также в отложник и добовляю переmеную и не че не происходит таже ошибка 4107 пишит в журнал пишит а отлож ордера выставляет, если не тежело глянте пожалуста что я пропустил

Файлы:
test_21_1.mq4  15 kb
 
FoxUA:

НЕ че не пойму у меня есть такая строка в открытии рыночного ордера, копирую ее также в отложник и добовляю переmеную и не че не происходит таже ошибка 4107 пишит в журнал пишит а отлож ордера выставляет, если не тежело глянте пожалуста что я пропустил


У Вас чертовски неудобочитаемая организация кода. Да и имена переменных имеют такие сокращения, что тоже усложняют читаемость.

Код нужно организовывать блочно. Имена переменным присваивать такие, чтоб при одном взгляде становилось понятно о чём идёт речь. Имена констант (возьмите себе за привычку) пишите заглавными буквами. Инициализацию констант значениями нужно выносить в блок инициализации. Так например, у Вас совершенно неоправдано использована строка

 string sy = Symbol();

в старте советника. Ну скажите, зачем на каждом тике нужно вызывать функцию  Symbol(), если на протяжение всего торга имя торгового инструмента не меняется? Достаточно 1 раз проинициализировать значением переменную sy в блоке инициализации и всё. Далее, вот это блок кода 

 

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

В корне не верен! Чтоб узнать стоп-лосс последнего ордера, его (ордер) сначала нужно выбрать при помощи OrderSelect() - пример смотрите в нижеприведённом счётчике ордеров. Это значит, что если Вам нужны уровни стопа последних ордеров, то делать это нужно через цикл. Следующее. Конструкция 

 

int total = OrdersTotal();
if(total == 0){

}

не оправдана. Функция OrdersTotal() вернёт общее число ордеров, уже открытых в терминале. В это число войдут и те ордера, который открыты по другим торговым инструментам и в частности те ордера, которые открыты не советником, а Вами лично вручную по тому же инструменту, на который брошен советник.

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

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  string SMB=Symbol();
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
      Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){continue;}// если не наш, то смотрим следующий
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  

 

 Перепишите код с учётом вышеизложенных рекомендаций!!!

 

Сорри не доглядел, что строки типа 

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT

вызывают подпрограмму.

Но всё равно её лучше организовывать иначе.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) { 

Не нужно передавать в подпрограмму символьное имя торгового инструмента. Ваша подпрограмма находится в советнике, а не в подключаемой библиотеке. Поскольку переменная sy у Вас объявлена на глобальном уровне советника, то эта переменная находится в области видимости таких подпрограмм. Далее, Вы передаёте в подпрограмму второй параметр, но при вызове самой подпрограммы Вы инициализируетет этот параметр значением ( int op=-1) - делать этого не нужно. То же самое касается и следующего параметра.

Строка

>> if (op<0 || OrderType()==op) {

опять-таки неудобочитаема. Посмотрите как оно у меня в счётчике организовано! 

 

И вот ещё что. Блок кода

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

у Вас вызывается на каждом тике. Но не на каждом тике он нужен. Вам нужно знать стоп/профит ордера лишь в некоторых случаях. Вот в этих случаях Вам и нужно задействовать вызов своей подпрограммы. 

 
spidey:

Доброе время суток, прикрутите алерт пожалуйста к индюку (зелёная пересекает красную сверху вниз - селл, обратно - бай)

Ну снова кто-то выкладывает на форуме краденые коды. :))))))))

Сомневаюсь, что кто-то захочет забесплатно копаться в этой мешанине пронумерованных переменных :) 

 
spidey:

Доброе время суток, прикрутите алерт пожалуйста к индюку (зелёная пересекает красную сверху вниз - селл, обратно - бай)

При повторении вынужден буду ходадайствовать о бане.

Выкладывание декомпилированных индикаторов - нарушение правил форума.

 
нужно код выкладывать?
 
drknn:

Сорри не доглядел, что строки типа

вызывают подпрограмму.

Но всё равно её лучше организовывать иначе.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

Не нужно передавать в подпрограмму символьное имя торгового инструмента. Ваша подпрограмма находится в советнике, а не в подключаемой библиотеке. Поскольку переменная sy у Вас объявлена на глобальном уровне советника, то эта переменная находится в области видимости таких подпрограмм. Далее, Вы передаёте в подпрограмму второй параметр, но при вызове самой подпрограммы Вы инициализируетет этот параметр значением ( int op=-1) - делать этого не нужно. То же самое касается и следующего параметра.

Строка

>> if (op<0 || OrderType()==op) {

опять-таки неудобочитаема. Посмотрите как оно у меня в счётчике организовано!

Тобиш я так понял вызов функции можно записать просто

PrAskLim = StopLossLastPos(OP_SELL) ; а в самой функции

double StopLossLastPos(int op=-1,) вот так да?

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

но я максимально исправил то что добовлял уже сам,

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

и второй вопрос как к этой цене можно прибавить спред PrAskLim = StopLossLastPos(OP_SELL) ; (Spread =MarketInfo(sy, MODE_SPREAD); )

вылажую подправленый вариант советника

Файлы:
test_21_2.mq4  16 kb
 
spidey:
нужно код выкладывать?
Нужно не выкладывать краденное.
 
drknn:
Нужно не выкладывать краденное.

Нужно не красть.

А вот правилами этого ресурса и не возбраняется...

https://www.mql5.com/ru/code/8089

;)

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