Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен программист? Оставь заказ и он сам тебя найдет!
Karakos Moql
44
Karakos Moql 2012.06.17 06:31 

Здравствуйте уважаемые форумчане. Меня зовут Роман, недавно начал писать советники на 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 2012.06.17 06:45  
Виктор
Модератор
6559
Виктор 2012.06.17 07:16  
Zhunko:
Сюда.
Если не читали, то прежде стоит прочитать статью по вашей теме:

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

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

...

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

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

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

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

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

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

Karakos Moql
44
Karakos Moql 2012.06.17 08:21  

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

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

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

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

Vasiliy Sokolov
21746
Vasiliy Sokolov 2012.06.17 09:48  

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

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
Андрей 2012.06.17 10:00  
Это вы с какого языка перешли в мокль?

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

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

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

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


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

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

Андрей
1890
Андрей 2012.06.17 10:40  
Roman.:

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

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

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

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

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

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