Помогите написать советника! - страница 4

 
icas:

Народ, вы откуда?!! Вы уроки сделали (учебник читали)?!! Здесь написать - 2 пальца о...

Я наверно из молдавии ибо и урок зделал и учебник читал и советники похожие смотрел но собрать и написать это не получается ХЕЛП МИ ЕСЛИ ЭТО НЕТЕЖЕЛО НАПИШИ С ОБЯСНЕНИЯМИ ФУНКЦИЙ БУДУ ОЧЕНЬ БЛОГОДАРЕН
 
FoxUA:

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

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


Хорошо. Расскажу я Вам суть, которой Вы, как говорите, не понимаете.

Функция start() советника и индикатора отличается от такой же функции скрипта тем, что в индикаторе и советнике она запускается на выполнение многократно, а в скрипте только 1 раз. Пусковым фактором в советнике и индикаторе является приход нового тика. Именно новый тик и запускает функцию start() в работу. В скрипте же эта функция запускается в работу самим фактом бросания скрипта на график. Тики тут ни какого влияния не оказывают.

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

Как написать такую подпрограмму?

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

Пишем код.

сначала организуем цикл, который пройдётся по Бай-ордерам 

//=========== 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++;// то увеличиваем значение счётчика на 1
      }  
    }
  }
  return(SchBuy);// возвращаем в основную программу количество пересчитанных ордеров.
}                  
//==================================================================================================

Теперь, когда подпрограмма готова в функции start() советника её можно применить следующим образом:

//+------------------------------------------------------------------+
//|                  Старт работы советника                          |
//+------------------------------------------------------------------+
int start(){
  if(!IsTradeAllowed()){// если торговый поток занят, то сообщаем об этом трейдеру
    Comment("Торговля запрещена в настройках терминала, либо торговый поток занят");
    Print("Торговля запрещена в настройках терминала, либо торговый поток занят");
    return(0);
  }
  if(SchBuy(MAGIC)==0){// если счётчик бай-ордеров равен нулю (бай-ордеров нет), то ставим бай ордер
    // за установку ордеров отвечает функция OrderSend() - вызовем её
    int TicketBuy=OrderSend(.. тут пишем параметры функции...));
    
  }

Но функция OrderSend() требует, чтоб в неё были переданы параметры. Поэтому перед вызовом этой функции эти параметры нужно заранее подготовить. Ставим курсор где-нибудь между букв этой функции и жмём в редакторе кода F1 или Ctrl+F1 - в открывшейся контекстной справке метаэдитора смотрим какие параметры передаются в эту функцию и перед тем как вызвать её делаем подготовку параметров. Например, функция требует, чтоб в неё была передана цена открытия ордера. Поскольку Бай-ордера открываются по цене Ask, то передать мы должны текущий аск. Но поскольку функция требует ввода нормализованных параметров, то сперва нужно эту цену нормализовать. Делается это с помощью функции NormalizeDouble()...

Ну так вот, уважаемый топикстартер! Чтоб втолковать Вам столь простые вещи мне пришлось сделать длиинючий пост. Вы понимаете, что попросив народ разобрать Вашего советника "по-косточкам", Вы запросили целый цикл лекций по программированию. Думаете, кто-то захочет сидеть и сутки на-пролёт печатать Вам обучающие материалы? Не занимайтесь ерундой - идите на сайт Ведихина и читайте эти лекции в уже готовом виде. Или ищите в инете иные курсы по форекс-программированию, или просто заплатите кому-то денег и пусть Вам напишут Вашего эксперта.

 
drknn:


Ну так вот, уважаемый топикстартер! Чтоб втолковать Вам столь простые вещи мне пришлось сделать длиинючий пост. Вы понимаете, что попросив народ разобрать Вашего советника "по-косточкам", Вы запросили целый цикл лекций по программированию. Думаете, кто-то захочет сидеть и сутки на-пролёт печатать Вам обучающие материалы? Не занимайтесь ерундой - идите на сайт Ведихина и читайте эти лекции в уже готовом виде. Или ищите в инете иные курсы по форекс-программированию, или просто заплатите кому-то денег и пусть Вам напишут Вашего эксперта.


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

int start(){
  if(!IsTradeAllowed()){// если торговый поток занят, то сообщаем об этом трейдеру
    Comment("Торговля запрещена в настройках терминала, либо торговый поток занят");
    Print("Торговля запрещена в настройках терминала, либо торговый поток занят");
    return(0);
  }
  if(SchBuy(MAGIC)==0){// если счётчик бай-ордеров равен нулю (бай-ордеров нет), то ставим бай ордер
    // за установку ордеров отвечает функция OrderSend() - вызовем её
    int TicketBuy=OrderSend(.. тут пишем параметры функции...));
    
  }

обяснеения то что пишится после // а не курс лекций с описанием. и тем немение спосибо вам но еслибы ты написал мне этот советник с обяснениями я былбы оч блогодарен

 

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

 

 

 
drknn:

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


пробывал но не фига не работает
 

да я имею виду експерта по моей тс чтоб в он выглядел вот так

if(!IsTradeAllowed()){// если торговый поток занят, то сообщаем об этом трейдеру

где

// если торговый поток занят, то сообщаем об этом трейдеру

обяснение функции

и все

 


 Удачи Вам в поисках альтруиста. Я ухожу - дела, знаете-ли есть и помимо Вас... 

 

Да видимо придется работать в ручную ибо тут все такие спецы шо времени нет, а написать простейшого експерта зась ибо карона спадет и 2 минуты драг времени потеряется

 
FoxUA:

Да видимо придется работать в ручную ибо тут все такие спецы шо времени нет, а написать простейшого експерта зась ибо карона спадет и 2 минуты драг времени потеряется


Шо, Вы не видэтэ народ просто занат, рыбу ловит на  "рынке". А вы тут со своими ... Даж кому это надо!
 

MetaEditor: Опираясь на силу шаблонов по этой ссылке прочтите про шаблон советника

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