Перейти к содержанию
Форекс Форум трейдеров Академии «MasterForex-V»

Создание скриптов


Рекомендуемые сообщения

Назначение скриптов достаточно простое: один раз исполниться и замолкнуть! Сделать какие-нибудь одноразовые расчёты, начертить что-нибудь, прочитать историю и записать в файл, сделать что-нибудь полезное, например, открыть ордер.... Кстати, с помощью скрипта ордер открывается несколько быстрее, чем вручную и это может помочь при "писовке".

 

В эту ветку мы будем записывать наши скрипты.

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 68
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Хочу представить вам простой скрипт, который расставляет линии поддержки, точки разворота, линии сопротивления согласно тем данным, которые вы введёте. Этот скрипт я написал ещё в самом начале своего прихода на Форекс, но до сих пор периодически использую. Он очень простой и вы сами прекрасно в нём разберётесь.

MQL
#property copyright "Игорь Лопатин, 2006"

 

// указывает, что нужно обязательно выводить окно со свойствами

#property show_inputs

 

// опеределяем значения для линий

// если равно нулю - линия выводиться не будет

extern double СопротивлениеВерхнее = 0;

extern double СопротивлениеНижнее = 0;

extern double ТочкаРазворота = 0;

extern double ПоддержкаВерхняя = 0;

extern double ПоддержкаНижняя = 0;

 

// определяем цвета для линий

extern color цвСопр1 = Red;

extern color цвСопр2 = Chocolate;

extern color цвРазв = White;

extern color цвПодд1 = DarkTurquoise;

extern color цвПодд2 = Lime;

 

// собственно здесь всё делается

int start() {

 // можно изменить стиль линии на желаемый - смотрите в хелпе

 int СтильЛинии = STYLE_DOT;

 // удалим всё старое, если есть

 if (ObjectFind("Сопр1" )!=-1) ObjectDelete("Сопр1" );

 if (ObjectFind("Сопр2" )!=-1) ObjectDelete("Сопр2" );

 if (ObjectFind("Разв" ) !=-1) ObjectDelete("Разв" );

 if (ObjectFind("Подд1" )!=-1) ObjectDelete("Подд1" );

 if (ObjectFind("Подд2" )!=-1) ObjectDelete("Подд2" );

 if (СопротивлениеВерхнее>0) {

  // если есть верхнее сопротивление

  ObjectCreate("Сопр1" ,OBJ_HLINE,0,0,СопротивлениеВерхнее);

  ObjectSet("Сопр1" ,OBJPROP_COLOR,цвСопр1);

  ObjectSet("Сопр1" ,OBJPROP_STYLE,СтильЛинии);

 }

 if (СопротивлениеНижнее>0) {

  // если есть нижнее сопротивление

  ObjectCreate("Сопр2" ,OBJ_HLINE,0,0,СопротивлениеНижнее);

  ObjectSet("Сопр2" ,OBJPROP_COLOR,цвСопр2);

  ObjectSet("Сопр2" ,OBJPROP_STYLE,СтильЛинии);

 }

 if (ТочкаРазворота>0) {

  // если есть точка разворота - пивот (Pivot)

  ObjectCreate("Разв" ,OBJ_HLINE,0,0,ТочкаРазворота);

  ObjectSet("Разв" ,OBJPROP_COLOR,цвРазв);

  ObjectSet("Разв" ,OBJPROP_STYLE,СтильЛинии);

 }

 if (ПоддержкаВерхняя>0) {

  // если есть верхняя поддержка

  ObjectCreate("Подд1" ,OBJ_HLINE,0,0,ПоддержкаВерхняя);

  ObjectSet("Подд1" ,OBJPROP_COLOR,цвПодд1);

  ObjectSet("Подд1" ,OBJPROP_STYLE,СтильЛинии);

 }

 if (ПоддержкаНижняя>0) {

  // если есть нижняя поддержка

  ObjectCreate("Подд2" ,OBJ_HLINE,0,0,ПоддержкаНижняя);

  ObjectSet("Подд2" ,OBJPROP_COLOR,цвПодд2);

  ObjectSet("Подд2" ,OBJPROP_STYLE,СтильЛинии);

 }

return(0);

}

 

Если запустить скрипт и не ввести данных, то просто будут удалены старые линии, которые были созданы этим скриптом.

Ссылка на комментарий
Поделиться на другие сайты

Сегодня мы напишем два скрипта, с помощью которых можно быстро открывать ордера на покупку или продажу.

 

Как создать новый скрипт вы уже знаете, повторять не буду.

Нам нужно только в начале опеределить следующее:

  1. число лотов
    double ЧислоЛотов=1;
  2. Проскальзывание
    int Проскальзывание=3;
  3. Магическое число - любое, приглянувшееся целое число
    int МагическоеЧисло=2222;
  4. Коментарий - всё, что угодно... :smile:
    string Коментарий = "Как мне это нравится!";
  5. и наконец, цвет символа
    для продажи
    color ЦветСимвола = RED
    для покупки
    color ЦветСимвола = GREEN

Ну а теперь собственно открытие ордера в функции start()

продажа:

OrderSend(Symbol(),OP_SELL,ЧислоЛотов,Bid,Проскальзываение,0,0,Коментарий,МагическоеЧисло,0,ЦветСимвола);

или

покупка:

OrderSend(Symbol(),OP_BUY,ЧислоЛотов,Ask,Проскальзываение,0,0,Коментарий,МагическоеЧисло,0,ЦветСимвола);

 

Вот собственно и всё... :biggrin:

 

Ну, а теперь вопросы ученикам:

  1. чего тут не хватает? :wink:
  2. как лучше всего оформить? :cool2:
  3. как лучше всего запускать? :rolleyes:

Ссылка на комментарий
Поделиться на другие сайты

  1. чего тут не хватает? :wink:
  2. как лучше всего оформить? :cool2:
  3. как лучше всего запускать? :rolleyes:

1. Нужна обработка ошибки открытия ордера

3. Нужно назначить горячую клавишу

Ссылка на комментарий
Поделиться на другие сайты

1. Нужна обработка ошибки открытия ордера

3. Нужно назначить горячую клавишу

Мне приятно видеть правильные ответы! :biggrin: :biggrin:

 

Ответ на второй вопрос будет такой: сделать для каждой позиции отдельный скрипт :smile:

 

И так, наш скрипт будет выглядеть так:

MQL
int start() {

 double ЧислоЛотов=1;

 int Проскальзывание=3;

 double СтопПотери=0;

 double ВзятьПрофит=0;

 int МагическоеЧисло=2222;

 datetime СрокИстечения=0;

 string Коментарий = "Как мне это нравится!" ;

 color ЦветСимвола = GREEN;

 int Ордер=OrderSend(

Symbol(),

OP_BUY,

ЧислоЛотов,

Ask,

Проскальзывание,

СтопПотери,

ВзятьПрофит,

Коментарий,

МагическоеЧисло,

СрокИстечения,

ЦветСимвола );

 if(Ордер<1) {

int error=GetLastError();

Print("Error = " ,error,ErrorDescription(error));

 }

 return(0);

}

Я выделил назначение переменных впереди для того, чтобы проще было бы разобраться с присвоением значений. Как видете, мы сначала назначили переменным значения, затем открыли ордер и после проверили его открытие. Если же ордер не был открыт (переменной Ордер не было назначено значение ордера - обычно целое число больше нуля), то в журнал записывается причина.

 

Данный файл я назвал "купить1" и назначил ему сочетание CTRL+1. Соответственно для открытия ордера в 0,1 лота я сделал файл "купить01" (клавиши CTRL+0), для ордера в 0,5 лота - "купить05" (клавиши CTRL+5). Точно так же были сделаны скрипты открытия ордеров на продажу. Они отличаются тем, что в качестве команды используется не константа OP_BUY, а константа OP_SELL и вместо цены Ask - цена Bid. Назвал я их соответственно: "продать1" (назначена клавиша ALT+1), "продать01" (клавиша ALT+0), "продать05" (клавиша ALT+5). Вот собственно и всё... :blush:

 

Эти скрипты достаточно хорошо помогают при пипсовке - ордера создаются быстро и меньше теряется профита! :rolleyes:

 

Ну, а теперь вопрос-задание. А как быть с закрытием ордеров? Предложите оптимальное решение...

Ссылка на комментарий
Поделиться на другие сайты

Liv,у меня в строке (Print("Error = " ,error,ErrorDescription(error));) идет ошибка-('ErrorDescription' - variable not defined) -Что это значит? Изменено пользователем XCh
Ссылка на комментарий
Поделиться на другие сайты

Да, действительно...

Я взял текст открытия ордера с одного из моих советников. Там используется описание ошибок. Ошибки взяты из справочника. Саму функцию вы можете взять в приложенном архиве. Конечно, можно было бы дать вам задание написать её, тем более, что она очень простая, но как-то назойливо получается с моей стороны... :wink: Но желающие могут попробовать сами её написать и сравнить с той, что использую я :rolleyes:

errordiscriptions.zip

Ссылка на комментарий
Поделиться на другие сайты

Мне пришли в ЛС сообщения о том, что скрипты покупки и продажи неверно ставят TakeProfit и StopLoss. И указали, что в функцию передают величину пунктов (pips). Вот только я же нигде не говорил, о том, что там значения будут в пунктах.....

 

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

 

В начале скрипта мы изменяем тип переменных:

int СтопПотери=0;

int ВзятьПрофит=0;

 

Для покупки:

Ask - СтопПотери*Point,

Ask+ ВзятьПрофит*Point,

 

Соответственно для продажи:

Bid + СтопПотери*Point,

Bid - ВзятьПрофит*Point,

 

Теперь можно передавать в функцию значения в пунктах. Как вы уже догадались, Point - это величина пункта текущего инструмента в валюте котировки.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
Уважаемый Liv, а не могли бы Вы рассказать о том, как создавать скрипты, которые выводили бы звуковой сигнал по достижении ценой определенного уровня, либо при наступлении определенного времени.
Ссылка на комментарий
Поделиться на другие сайты

Для этого скрипт не нужен - в MT4 имеется встроенные функции для этого:

закладка "Сигналы" -> правой кнопкой кликнуть на пустом месте (или нажать кнопку Insert), появится окошко.... и там легко разобраться.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Для этого скрипт не нужен - в MT4 имеется встроенные функции для этого:

закладка "Сигналы" -> правой кнопкой кликнуть на пустом месте (или нажать кнопку Insert), появится окошко.... и там легко разобраться.

 

Уважаемый Liv

Может у меня не тот МТ4, но я не могу настроить сигнал.

Пожалуйста, если не утруднит, обьясните подробно.

 

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

 

Буду благодарен за ответ.

Тимофеич

Ссылка на комментарий
Поделиться на другие сайты

Уважаемый Liv

Может у меня не тот МТ4, но я не могу настроить сигнал.

Пожалуйста, если не утруднит, обьясните подробно.

Нажать клавиши 'Ctrl+T' - появится (или исчезнет, если он был - тогда нажать ещё раз) окошко с надписью "Терминал". Там внизу есть несколько закладок:

"Торговля", "История счёта", "Новости", "Сигналы" и т.д....

Нас интересует закладка "Сигналы" - кликаем на ней левой кнопкой мышки. Открывается список сигналов. Конечно, если им ещё не пользовался, то там ничего нет.

Создадим сигнал:

  1. кликаем правой кнопкой мышки в любом месте этого окошка
  2. из появившегося меню выбираем "Создать" - открывается окошко создания сигналов
  3. кликаем левой кнопкой мышки на галочке "Разрешить" - галочка должна стоять
  4. из списка "Действие" выбираем "Sound" (по-аглицки - "Звук")
  5. из списка "Сисмвол" выбираем инструмент, на котором работаем, напр. "EURUSD"
  6. из списка "Условие" выбираем, например, "Bid>"
  7. в поле "Значение" вводим значение инструмента, при превышении цены предложения которого прозвучит сигнал
  8. из списка "Источник" вибираем вид звука, который будет звучать
  9. можно установить свой звук, для чего нажать левой кнопкой мышки кнопку с тремя точками справа от списка сигналов
  10. можно нажать кнопку "Тест" чтобы послушать как звучит этот сигнал для твоего уха
  11. нажать кнопку "Ок" для записи и установки сигнала
  12. или нажать кнопку "Отмена" для того, чтобы не создавать сигнал
  13. ждём достижение установленного события и балдеем...... :blush:

Достаточно просто.... и если уж сейчас не получится, то стоит задуматься, а тем ли занимаешься... :ninja:

 

И еще вопрос: для канальной стратегии мне хотелось-бы иметь скрипт выставляющий несколько

......

Тимофеич

Тут я хотел написать "немножко не понял".... но решил написать "совсем не понял"... :glare:

Ссылка на комментарий
Поделиться на другие сайты


×
×
  • Создать...