Скачать MetaTrader 5

Вопросы по написанию программ от новичка к профессионалам

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Karakos Moql
44
Karakos Moql  

Здравствуйте уважаемые форумчане. Меня зовут Роман, недавно начал писать советники на MQL4 и на данном этапе возникает много вопросов.

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

При реализации такого файла появились следующие вопросы:

1. В файле .mqh присутствует такая запись:

int OrderBuy = OrderSend(symbol,OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point,comment,MagicNumber,0,Green);

- Возможно ли вообще объявить в коде советника переменную OrderBuy и откроется ли ордер после ее объявления?

- Правильно ли я определил тип переменной - int ?

- Каким образом можно объявить переменную OrderBuy в советнике: просто вставив в код OrderBuy; или это нужно делать по-другому?

2. Так же в файле .mqh я разместил функцию осуществляющую ТрэйлингСтоп:

//функция трейлинг стопа для sell ордеров

void SellTral(int MagicNumber, int TrailingStop)

{

 OrderSelect(SELECT_BY_POS, MODE_TRADES);                            //Просмотр открытых ордеров

 if (OrderMagicNumber()== MagicNumber && OrderType()==OP_SELL)       

  {

   if(TrailingStop>0)                                                  //Если ТС установлен вообще и не равен нулю

    {

     if(OrderOpenPrice()-Ask>Point*TrailingStop)                     //Если цена прошла путь от цены открытия до уровня ТС то ставим

      {

       if(OrderStopLoss()>Ask+Point*TrailingStop)                   //Текущий стоп-лосс находится выше, чем он должен быть. Т.е. выше той цены, которую мы получим,

                                                                    //если к тек. цене Ask прибавим величину TrailingStop

        {

         int tral=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Green); //объявляем переменную tral

         int sleep=Sleep(300000);           //ставим советник на паузу 5 мин.(1000=1сек), что бы избежать модификации ордера на каждом тике 

         int ret=return(0);

         return(tral,sleep,ret);           //функция возвращает в эксперт команду на модификацию ордера, потом ставит советник на паузу, затем заканчивает функцию start

        }

      }

    }

  }

}

- правильно ли определен тип функции void ?

- возможно ли вообще такое построение функции, я имею ввиду что функция возвращает переменную трал, при вызове которой должна произойти модификация ордера, потом ставит советник на паузу, а потом заканчивает функцию start? сработает ли такая функция?

- если функция сработает, то как в тексте советника объявить переменные tral,sleep и ret что бы они исполнили свое предназначение?

Жду от вас конструктивной критики и дельных советов, заранее благодарю.

Vadim Zhunko
5226
Vadim Zhunko  
Виктор
Модератор
6559
Виктор  
Zhunko:
Сюда.
Если не читали, то прежде стоит прочитать статью по вашей теме:

Опираясь на силу шаблонов.
Роман
7939
Роман  
Experto:

Здравствуйте уважаемые форумчане.

...

Жду от вас конструктивной критики и дельных советов, заранее благодарю.

Добрый день, тёзка.

Знакомьтесь с учебником и документацией внимательно и полностью + разберите коды каких-нибудь советников с кодэбазы - подобные вопросы сами собой отпадут.

Если база по программированию - напрочь отсутствует, то готовьтесь к затяжному марафону... :-)

Все вопросы задавайте в специализированной для этого ветке форума, дабы не гадить (спамить) "грустными" темами...

П.С. "Дельных совет", ИМХО, при старте, если ещё не зашлакованы кодом...:-), перебирайтесь сразу на пятёру с ёё структурами и классами, кроме этого там опять же не обязательно кодить посредством ООП, можно также делать всё через функции, ибо всё равно червёрке осталось недолго...

Karakos Moql
44
Karakos Moql  

Спасибо всем за советы, буду дальше изучать и изучать.

По поводу отдельной темы для новичков, то это просто ужас - 190 страниц сообщений, попробуй там найти что то дельное, а поиск по сайту не всегда дает адекватные результаты. И нет никакой уверенности что на твой вопрос ответят и он не затеряется за рядом более новых вопросов. Хотя такова структура самого форума - нет ни разделов ни подразделов, одни сплошные темы, для чего тогда форум вообще создавался? - что бы профи могли общаться между собой, а новички, которые так и хотят "гадить (спамить) "грустными" темами..." должны в одной теме толпиться?

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

Еще раз всем спасибо, до свидания.

Vasiliy Sokolov
24696
Vasiliy Sokolov  

Если вкратце то все не правильно. Особенно вот этот кусок:

if(OrderStopLoss()>Ask+Point*TrailingStop)                   //Текущий стоп-лосс находится выше, чем он должен быть. Т.е. выше той цены, которую мы получим,

                                                                    //если к тек. цене Ask прибавим величину TrailingStop

        {

         int tral=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Green); //объявляем переменную tral

         int sleep=Sleep(300000);           //ставим советник на паузу 5 мин.(1000=1сек), что бы избежать модификации ордера на каждом тике 

         int ret=return(0);

         return(tral,sleep,ret);           //функция возвращает в эксперт команду на модификацию ордера, потом ставит советник на паузу, затем заканчивает функцию start

        }

Функция вовращает void т.е. ничего. Писать надо просто return. Возвращаемое значение может быть только одно и оно должно соответствовать тому типу, который объявляется в качестве возвращаемого. Нельзя использовать оператор return так: int ret=return(0); Return - это команда выхода из текущей функции. Его вызов автоматически завершает функцию на текущем месте. Также необходимо избегать большой вложенности условий if - но это лирика.

Андрей
1890
Андрей  
Это вы с какого языка перешли в мокль?

Смотрю на конструкцию
return(tral,sleep,ret);

Возможно, C# ?
Роман
7939
Роман  
jartmailru:
Это вы с какого языка перешли в мокль?

Смотрю на конструкцию
return(tral,sleep,ret);

Возможно, C# ?


Чел - вообще не в темах языков... :-)

включая знакомство с функциями... :-)

Андрей
1890
Андрей  
Roman.:

Чел - вообще не в темах языков... :-)
включая знакомство с функциями... :-)

Да не... конструкция отчасти похожа на правду.
Так объявляются свойства класса.
Типа, дёргаешь свойство- а на деле там вызывается функция.
И такие вот... множественные возвраты... тоже бывают, в перле.
Vasiliy Sokolov
24696
Vasiliy Sokolov  
jartmailru:
Это вы с какого языка перешли в мокль?

Смотрю на конструкцию
return(tral,sleep,ret);

Возможно, C# ?

Такое извращение в C# пока еще не ввели. Там для этих целей служат модификаторы ref и aut.
Vasiliy Sokolov
24696
Vasiliy Sokolov  
jartmailru:
Да не... конструкция отчасти похожа на правду.
Так объявляются свойства класса.
Типа, дёргаешь свойство- а на деле там вызывается функция.
И такие вот... множественные возвраты... тоже бывают, в перле.

Ага, а еще бывает функция внутри функции, а также некрофилия и прочие извращения. Но должны ли мы все это практиковать, только потому что это есть?
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий