Заработай до
50000$
на приглашении друзей
получить StartUp Bonus
от ИнстаФорекс
Вложений не требуется!
Начни торговлю
без вложений и риска
С новым STARTUP бонусом 1000$
Получи бонус
55%
от ИнстаФорекс
на каждое пополнение
Ответить в теме
Страница 1 из 29
1 2 11 ... Последняя ◄╝

Показаны сообщения: с 1 по 20 из 561

Тема: Учимся программировать на MQL4 вместе с Mr.Артуром

 Перейти в классический вид темы
  1. Линк #1
    Кандидат форумных наук
    Отдыхаю
     
    Artur приемлемый уровень репутации Artur приемлемый уровень репутации Аватар для Artur
    Регистрация:
    06.09.2010
    Пол:
    Мужчина
    Сообщений:
    2,038
    Деньги за посты:
    26207 RUB (Подробнее)
    Поставил лайков:
    49
    Получено лайков:  203
    в 170 сообщениях
    10%
    Приветствую всех новичков так же как я желающих самостоятельно научиться писать программы на MQL4. В этой теме я буду конспектировать нелегкий путь своего обучения с примерами и конкретными задачами которые предлагаю решать сообща . Думаю всем вместе нам будет легче разобраться и освоиться в этом языке программирования.

    Код:
    //+------------------------------------------------------------------+
    //|                                                          111.mq4 |
    //|                      Copyright © 2011, MetaQuotes Software Corp. |
    //|                                        http://www.metaquotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2011, MetaQuotes Software Corp."
    #property link      "http://www.metaquotes.net"
    
    //+++-здесь вписываются переменные-+++
    //+------------------------------------------------------------------+
    //| expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
      {
    //----
       
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //----
       
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| expert start function                                            |
    //+------------------------------------------------------------------+
    int start() //+++- старт самой программы и написание его основного кода тут-+++
      {
    //----
       
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    это код простого советника
    дальше я буду выкладывать прочее необходимое
    если будут вопросы пишите постараюсь ответить

    Последний раз редактировалось DGreen; 24.07.2011 в 22:51.

    Предлагаю к инвестированию ^ /-/ Перечитайте регламент найдёте много интерестного!

  2. post_thanks Получено лайков: 1

    Krashid (13.03.2012)

     
  3. ТОП сообщений
    2019-05-07   23:11
    Лучший ответ #1
    Накопленные выплаты 154980 RUB
    2012-08-15   15:38
    Лучший ответ #2
    Накопленные выплаты 18175 RUB

    Представьте себе массив, в который записываются различные события, все идет по порядку, можно проверить: void start() { for(int i = OrdersTotal() -1; i >= 0;i--) { if(OrderSelect(i,SELECT_BY_POS)) Alert("index = ",i," open_time = ",TimeToStr(OrderOpenTime(), TIME_DATE|TIME_MINUTES|TIME_SECONDS)); } } Но ситуации бывают разными, вот например: - "Есть ДЦ, где OrderOpenTime() показывает время выставления отложенного ордера, а не время его срабатывания. Поэтому затруднительно узнать, когда же открылась позиция".

    2012-02-27   20:51
    Лучший ответ #3
    Накопленные выплаты 4855 RUB

    Что модифицируешь от того и отталкивайся, если тп, то делай условие чтобы тп ордера модифился при подходе цены к текущему теикпрофиту на несколько пунктов.При открытии ордера ставишь тп на (31 пункт + расстояние модификации(5пип допустим) итого 36) от открытия ордера и далее запускаешь условие вида (для селл) if (bid<=OrderTakeProfit()+ 5*point) {Модифицирвать тп ордера на OrderTakeProfit() минус расстояние на которое нужно перенести тп +5пип}

    2011-08-03   17:59
    Лучший ответ #4
    Накопленные выплаты 322 RUB

    Для поиска последнего закрытого ордера можно использовать время закрытия ордеров, пробегаем по всем ордерами находим максимальное время... int Magic = 0; int closetime= 0,lastorder=0; for(int i=0;i

    2019-05-07   09:42
    Лучший ответ #5
    Накопленные выплаты 26432 RUB

    советник привязан к брокеру , не могу отвязать советника.

    Изображение
    Превью
    2019-05-07   11:17
    Лучший ответ #6
    Накопленные выплаты 43216 RUB

    Закомментируй строку условия и фигурные скобки тела условия, само тело не трогай. Ток найди именно правильную фигурную скобку, которая закрывает тело условия. Ну и если есть секция "else", после основного условия, то её можешь закомментировать вместе с телом условия. Для наглядности: // if ( условие ) // { <------ Начало тела условия. тело условия. // } <------ Конец тела условия. Эту скобку ищи внимательно. Обычно в редакторе пары скобок подсвечиваются. // else // { // тело условия. // }

  4. Линк #2
    Кандидат форумных наук
    Отдыхаю
     
    Artur приемлемый уровень репутации Artur приемлемый уровень репутации Аватар для Artur
    Регистрация:
    06.09.2010
    Пол:
    Мужчина
    Сообщений:
    2,038
    Деньги за посты:
    26207 RUB (Подробнее)
    Поставил лайков:
    49
    Получено лайков:  203
    в 170 сообщениях
    10%
    где написанно
    Код:
    //+++-здесь вписываются переменные -++
    это место для вписания переменных типа
    Код:
    extern int a = 0;
             double b=0;
             bool c = true;
             string = 0;
    для тех кто не знает - "//" - этот символ означает коментарий который длится до окончания строки


    Предлагаю к инвестированию ^ /-/ Перечитайте регламент найдёте много интерестного!

  5. Линк #3
    Кандидат форумных наук
    Отдыхаю
     
    Artur приемлемый уровень репутации Artur приемлемый уровень репутации Аватар для Artur
    Регистрация:
    06.09.2010
    Пол:
    Мужчина
    Сообщений:
    2,038
    Деньги за посты:
    26207 RUB (Подробнее)
    Поставил лайков:
    49
    Получено лайков:  203
    в 170 сообщениях
    10%
    int является целочисленным выражением без запятой. например 1,2,3,4,5,6, и т.д
    double это числа с плавающей запятой например 0,01 или 0,1
    bool это логическое значение... тут вариантов всего два true или false
    и string простейшие числа до 256 без запятой для малого хранения в памяти.

    позже я опишу переменные которые пока что не указал


    Предлагаю к инвестированию ^ /-/ Перечитайте регламент найдёте много интерестного!

  6. Линк #4
    Кандидат форумных наук
    mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь Аватар для mell
    Регистрация:
    15.06.2011
    Пол:
    Мужчина
    Сообщений:
    2,079
    Деньги за посты:
    9596 RUB (Подробнее)
    Поставил лайков:
    1,141
    Получено лайков:  4,034
    в 1,228 сообщениях
    194%
    приветствую, тогда первый вопрос. не могу придумать как выставлять стоплосс на двух трех позициях сразу. пока выставляется только на одном. а мне надо на всех одинаковый стоплосс .
    Код:
    for (int i = 0; i < OrdersTotal(); i++)
      if (OrderSelect(i, SELECT_BY_POS))
       if (OrderSymbol() == Symbol() && (OrderMagicNumber() ==MAGIC2 && OrderType() < 2)||(OrderMagicNumber() ==MAGIC1 && OrderType() < 2)
    ||(OrderMagicNumber() ==MAGIC3 && OrderType() < 2)|| (OrderMagicNumber() ==MAGIC22 && OrderType() < 2)
    ||(OrderMagicNumber() ==MAGIC23 && OrderType() < 2))
       {
        RefreshRates();
        double OpPrice=OrderOpenPrice();
       if(OrderType() == OP_BUY)            
        if((OpPrice+TrailingStop1*Tick) < ld_16)
       OrderModify(OrderTicket(), 0, (OpPrice+TrailingStop1*Tick), OrderTakeProfit(), 0, Blue);

    Индикаторы зло! Не верю никому кроме Bollinger Bands. хотя.. и ему не верю!
    Тестирую новинку, сольет не сольет...:
    [img]http://widgets.********.com/widgets/1072581/mini.jpg[/img]

  7. Линк #5
    Кандидат форумных наук
    Отдыхаю
     
    Artur приемлемый уровень репутации Artur приемлемый уровень репутации Аватар для Artur
    Регистрация:
    06.09.2010
    Пол:
    Мужчина
    Сообщений:
    2,038
    Деньги за посты:
    26207 RUB (Подробнее)
    Поставил лайков:
    49
    Получено лайков:  203
    в 170 сообщениях
    10%
    Давайте разберём ваш скрипт на состовляющие
    Код:
     for (int i = 0; i < OrdersTotal(); i++)
    for это цикл (повторение указанное количество раз) у вас же цикл повторяется i < OrderTotal
    Код:
      if (OrderSelect(i, SELECT_BY_POS))
    if orderSelect(номер ордера, порядковый номер позиции в списке)
    Код:
      if (OrderSymbol() == Symbol() && (OrderMagicNumber() ==MAGIC2 && OrderType() < 2)(OrderMagicNumber() ==MAGIC1 && OrderType() < 2)(OrderMagicNumber() ==MAGIC3 && OrderType() < 2) (OrderMagicNumber() ==MAGIC22 && OrderType() < 2)(OrderMagicNumber() ==MAGIC23 && OrderType() < 2))
    если Символ ордера любой и магический номер = 2 и типордера < 2 (может лечше <=)
    магический номер = 1 и тип ордера < 2
    магический номер = 3 и тип ордера < 2
    и дальше повторяются почти так же с magic22 и 23

    Код:
     {    RefreshRates();
        double OpPrice=OrderOpenPrice();
       if(OrderType() == OP_BUY)            
        if((OpPrice+TrailingStop1*Tick) < ld_16)
       OrderModify(OrderTicket(), 0, (OpPrice+TrailingStop1*Tick), OrderTakeProfit(), 0, Blue);
    дальше обновление и условие

    Код:
    if((OpPrice+TrailingStop1*Tick) < ld_16)
    откуда что и куда... параметр ЛД_16 ...

    это не для новечков уж точно!

    и ещё кое что If это условие и переводится как если а ordertotal это количество ордеров


    Предлагаю к инвестированию ^ /-/ Перечитайте регламент найдёте много интерестного!

  8. post_thanks Получено лайков: 1

    mell (23.07.2011)

  9. Линк #6
    Кандидат форумных наук
    mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь Аватар для mell
    Регистрация:
    15.06.2011
    Пол:
    Мужчина
    Сообщений:
    2,079
    Деньги за посты:
    9596 RUB (Подробнее)
    Поставил лайков:
    1,141
    Получено лайков:  4,034
    в 1,228 сообщениях
    194%
    лд_16 это нормализованный Bid

    вот что я наляпал основываясь на изучении похожих тралов из различных скриптов. теперь он ставит стоплоссы на все ордера но не совсем понятно что такое знак "!" перед ордерселект. кусок кода для баевских ордеров, для селла аналогично но там другие магики, так как у меня два тралла по одной логике баев селлов и по другой логике.
    Код:
    void TrailingStopDoubleLevel()
    {
    double OpPrice=OrderOpenPrice();
    if((OpPrice+TrailingStop1*Tick) < ld_16)
     
        
      {   for(int i=OrdersTotal()-1;i>=0;i--)
      
       {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
             continue;
          if(OrderSymbol()==Symbol()&& ((OrderMagicNumber() == MAGIC1 && OrderType() < 2)||
             (OrderMagicNumber() == MAGIC2 && OrderType() < 2)||
            (OrderMagicNumber() == MAGIC3 && OrderType() < 2) ))
             continue;
    // Блок 1. Нормализация основных характеристик позиции -----------------------------------
       // RefreshRates(); //это я экспериментировал с освежение данных
       
       if(OrderType() == OP_BUY)            
          OrderModify(OrderTicket(), 0, (OpPrice+TrailingStop1*Tick), OrderTakeProfit(), 0);
          }
        }
       
      else
      {
      if((OpPrice-TrailingStop1*Tick) > ld_8)
      
       { 
       for(int i1=OrdersTotal()-1;i1>=0;i1--)
        {
         if(!OrderSelect(i1,SELECT_BY_POS,MODE_TRADES))
             continue;
          if(OrderSymbol()==Symbol()&&( (OrderMagicNumber() == MAGIC15 && OrderType() < 2)||
           (OrderMagicNumber() == MAGIC25 && OrderType() < 2)||
           (OrderMagicNumber() == MAGIC35 && OrderType() < 2) ))
             continue;
    получается правильнее будет написать
    Код:
    вместо   if(OrderSymbol()==Symbol()
    так   if(OrderSymbol()==NULL
    правильно? чтоб работал только по текущему инструменту.?
    а почему лучше: OrderType() <=2 ? я ведь работаю только с открытыми ордерами.

    Индикаторы зло! Не верю никому кроме Bollinger Bands. хотя.. и ему не верю!
    Тестирую новинку, сольет не сольет...:
    [img]http://widgets.********.com/widgets/1072581/mini.jpg[/img]

  10. Линк #7
    Знающий
    Сама доброта
     
    DGreen авторитетный пользователь DGreen авторитетный пользователь DGreen авторитетный пользователь DGreen авторитетный пользователь DGreen авторитетный пользователь DGreen авторитетный пользователь DGreen авторитетный пользователь DGreen авторитетный пользователь DGreen авторитетный пользователь DGreen авторитетный пользователь DGreen авторитетный пользователь Аватар для DGreen
    Регистрация:
    01.11.2010
    Пол:
    Мужчина
    Сообщений:
    4,018
    Деньги за посты:
    4855 RUB (Подробнее)
    Поставил лайков:
    3,491
    Получено лайков:  3,779
    в 1,500 сообщениях
    94%
    Цитата Сообщение от mell Посмотреть сообщение
    не совсем понятно что такое знак "!" перед ордерселект
    Это логическое "Не" ,это условие не позволяет продолжить работу если выбор ордера не удался.(а соответственно этого ордера не существует)
    http://docs.mql4.com/ru/basis/operations/bool


  11. Линк #8
    Кандидат форумных наук
    Отдыхаю
     
    Artur приемлемый уровень репутации Artur приемлемый уровень репутации Аватар для Artur
    Регистрация:
    06.09.2010
    Пол:
    Мужчина
    Сообщений:
    2,038
    Деньги за посты:
    26207 RUB (Подробнее)
    Поставил лайков:
    49
    Получено лайков:  203
    в 170 сообщениях
    10%
    Цитата Сообщение от mell Посмотреть сообщение
    получается правильнее будет написать
    Код:
    вместо   if(OrderSymbol()==Symbol()
    так   if(OrderSymbol()==NULL
    правильно?
    да.

    что косается ордер тип = http://docs.mql4.com/ru/trading/OrderType


    Предлагаю к инвестированию ^ /-/ Перечитайте регламент найдёте много интерестного!

  12. Линк #9
    Кандидат форумных наук
    Отдыхаю
     
    Artur приемлемый уровень репутации Artur приемлемый уровень репутации Аватар для Artur
    Регистрация:
    06.09.2010
    Пол:
    Мужчина
    Сообщений:
    2,038
    Деньги за посты:
    26207 RUB (Подробнее)
    Поставил лайков:
    49
    Получено лайков:  203
    в 170 сообщениях
    10%
    продолжим нормализованный курс
    в поле
    Код:
    int start() //+++- старт самой программы и написание его основного кода тут-+++
    будем писать саму программу. для примера начну с простейшего пересечения двух средне скользящих
    после int start() ставится фигурная скобочка и всё что внутри неё и программа читает как рабочий код программы
    {
    double a = iMA(в этом поле вставляются параметры первой средней скользящей);
    и так же описывается вторая МА только мы присваиваем ей другое значение (не а) а например b
    после чего начинаем писать условие открытия ордеров
    if (a>b){
    OrderSend // открытие ордера ............

    }
    } // незабывайте закрыть иначе будет считывать дальше


    Предлагаю к инвестированию ^ /-/ Перечитайте регламент найдёте много интерестного!

  13. Линк #10
    Кандидат форумных наук
    mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь Аватар для mell
    Регистрация:
    15.06.2011
    Пол:
    Мужчина
    Сообщений:
    2,079
    Деньги за посты:
    9596 RUB (Подробнее)
    Поставил лайков:
    1,141
    Получено лайков:  4,034
    в 1,228 сообщениях
    194%
    Цитата Сообщение от Artur Посмотреть сообщение
    да.

    что косается ордер тип = http://docs.mql4.com/ru/trading/OrderType
    но там нет цифрового обозначения ордеров, к сожалению. я думал что это выглядит так:
    OP_BUY - 0
    OP_SELL - 1
    OP_BUYLIMIT - 2
    OP_BUYSTOP - 3
    OP_SELLLIMIT - 4
    OP_SELLSTOP - 5
    поэтому у меня стоит цифра < 2, видимо я что то не так понимаю?

    Индикаторы зло! Не верю никому кроме Bollinger Bands. хотя.. и ему не верю!
    Тестирую новинку, сольет не сольет...:
    [img]http://widgets.********.com/widgets/1072581/mini.jpg[/img]

  14. Линк #11
    Кандидат форумных наук
    Отдыхаю
     
    Artur приемлемый уровень репутации Artur приемлемый уровень репутации Аватар для Artur
    Регистрация:
    06.09.2010
    Пол:
    Мужчина
    Сообщений:
    2,038
    Деньги за посты:
    26207 RUB (Подробнее)
    Поставил лайков:
    49
    Получено лайков:  203
    в 170 сообщениях
    10%
    вроде так должно быть
    OP_BUY - 1
    OP_SELL - 2
    OP_BUYLIMIT - 3
    OP_BUYSTOP - 4
    OP_SELLLIMIT - 5
    OP_SELLSTOP - 6

    хотя возможно я ошибаюсь
    может лучше без численных значений что бы программа луче понимала написать OP_BUY&&OP_SELL


    Предлагаю к инвестированию ^ /-/ Перечитайте регламент найдёте много интерестного!

  15. Линк #12
    Кандидат форумных наук
    mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь mell авторитетный пользователь Аватар для mell
    Регистрация:
    15.06.2011
    Пол:
    Мужчина
    Сообщений:
    2,079
    Деньги за посты:
    9596 RUB (Подробнее)
    Поставил лайков:
    1,141
    Получено лайков:  4,034
    в 1,228 сообщениях
    194%
    Цитата Сообщение от Artur Посмотреть сообщение
    вроде так должно быть
    OP_BUY - 1
    OP_SELL - 2
    OP_BUYLIMIT - 3
    OP_BUYSTOP - 4
    OP_SELLLIMIT - 5
    OP_SELLSTOP - 6

    хотя возможно я ошибаюсь
    может лучше без численных значений что бы программа луче понимала написать OP_BUY&&OP_SELL
    я сам точно не знаю. но в моем случае при <2 срабатывает на селловских и на баевских ордерах. и я в молодости увлекался С#, с тех пор привык что отсчет в программинге обычно начинается с нуля. может я и не прав.. думаю вы правы, лучше без числовых значений, программе все равно а человеку легче читать. хотя код тогда увеличится: OrderType() == OP_BUY|| OrderType() ==OP_SELL

    проверил, if(OrderSymbol()==NULL выдает ошибку.

    Индикаторы зло! Не верю никому кроме Bollinger Bands. хотя.. и ему не верю!
    Тестирую новинку, сольет не сольет...:
    [img]http://widgets.********.com/widgets/1072581/mini.jpg[/img]

  16. Линк #13
    Кандидат форумных наук
    no
     
    fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация Аватар для fore-x
    Регистрация:
    18.03.2011
    Пол:
    Мужчина
    Сообщений:
    1,716
    Деньги за посты:
    18175 RUB (Подробнее)
    Поставил лайков:
    440
    Получено лайков:  584
    в 399 сообщениях
    34%
    Всем привет, вопрос: функция - OrderCloseBy( ) -"Закрытие одной открытой позиции другой позицией, открытой по тому же самому инструменту, но в противоположном направлении", эта функция закрывает встречные ордера (уже открытые) или закрывает одну открытую позицию и потом открывает ордер в противоположном направлении (делает переворот)?