Николай AlKaZaR Мануйлов
2 дек 2009 в 0:56
В этой теме я буду выкладывать коды советников, которые я написал.Выкладывать буду по кусочкам и буду объяснять что это все значит.Задавайте вопросы, что не понятно, буду объяснять.Заинтересованымлюдям могу написать советник личн за небольшое денежное вознаграждение.Ну что ж, приступим :)
Константин Добрый Smile Карпов
2 дек 2009 в 1:10
В группе давно назрела потребность в том, чтобы была тема с кодером, который готов объяснять на примерах как пишутся советники.В добрый путь.
Николай AlKaZaR Мануйлов
2 дек 2009 в 1:15
string sb[10] = {"EURUSD","GBPUSD","USDCHF","USDJPY","USDCAD","AUDUSD","NZDUSD","EURCHF","EURGBP","EURJPY"};extern double Lot = 0.1;extern bool work = true;int start(){string da = "";for (int b=0; b<10; b++){da = da + "\n";da = da + buy(sb[b]);}Comment(da);return;}
Николай AlKaZaR Мануйлов
2 дек 2009 в 1:16
... - мой последний советник, который я дописал сегодня... суть его такова - на пАрах , которые вы видите в первой строчке кода, открываются сделки buy лотом указанным во второй строчке и с тейкпрофитом в 50п. далее куда бы ни пошла цена, через каждые 50п выставляется также ордер buy с такими же данными... и так на 10 пАрах сразу... я предполагаю что это может и плюсовать :) в общем разбираем каждую строку:1 строка - задаем массив с 10-ю парами по которым будем работать.2 строка - задаем фиксированный лот для всех ордеров. обратите внимание на слово "extern" в начале строки. оно обозначает что этот параметр можно будет менять из терминала в параметрах советника.3 строка - задаем условие при котором советник будет открывать сделки. если work = true то сделки открываются, если work = false , то сделки не открываются, но советник продолжает работать дальше. так же эту переменную можно менять из терминала, что довольно удобно.4 строка - функция start которая является базовой функцией любого советника и должна присутствовать всегда. так как советники включаются на каждом тике, то терминал вызывает именно функцию start а не какую либо другую. а из этой функции уже можно вызвать пользовательские функции как вы увидите дальше.5 строка - задаем переменную da с типом string. это значит что переменная будет содержать текст. в данном коде это переменная комментов.6 строка - цикл for. задаем любую переменную b=0. цикл будет действовать пока верно утверждение b<10. и после каждого выполнения одного круга цикла b++ переменная будет увеличиваться на 1. то есть цикл сделает 10 кругов, как раз для 10-и наших рабочих пар.7 строка - к переменной коммента добавляем "\n" что значит перенос коментов на след. строку, чтобы все было красиво и понятно :)8 строка - далее к этой же переменной мы присваиваем значение, которое нам вернет функция buy(sb[b]) - это пользовательская функция, которую я написал дальше. sb[b] в скобках этой функции значит что нужно в эту функцию передать значение массива sb с номером b (которая у нас в цикле постоянно увеличивается на 1).9 строка - выводим коментарий на монитор, чтобы юзеру было все понятно :)return - выход из функции start. это значит конец работы советника.в данном кусочке важен только цикл for и функция buy(sb[b]) которая вызывается нужное нам кол-во раз (в данном месте 10 раз). основной код советника заключается в функции buy(sb[b]) и будет описана далее.
Николай AlKaZaR Мануйлов
2 дек 2009 в 12:28
string buy(string symb){string da = "";int s = MarketInfo(symb,MODE_SPREAD);double a = MarketInfo(symb,MODE_ASK);int d = MarketInfo(symb,MODE_DIGITS);double p = MarketInfo(symb,MODE_POINT);double tp;da = da + "Ha " + symb;if (work == true){int tot=0;if (OrdersTotal() > 0){for (int t=0; t<OrdersTotal(); t++){OrderSelect(t,SELECT_BY_POS,MODE_TRADES);if (OrderSymbol() == symb){if (OrderMagicNumber()==853){double op = OrderOpenPrice();tot++;}}}}
Николай AlKaZaR Мануйлов
2 дек 2009 в 12:50
второй кусок моего советника. описание:1 строка - задаем пользовательскую функцию. в данный момент это функция string buy(string symb). string - означает что и функция будет возвращать текст и в скобках (передаваемое значение из функции старт) тоже текст (в нашем случае это имя пары. чтоб не запутаться обозначаю symb).2 строка - опять задаем переменную комментов. заметьте что в коде мы два раза задали переменную с одним и тем же названием da. в одной функции может находиться только 1 переменная с одним названием. но так как это уже вторая функция то в ней можно написать такую же переменную и никакой путаницы не будет. переменные, заданные в функции работают только в этой функции.3 строка - задаем переменную s и присваиваем ей значение спреда на нужной нам паре MarketInfo(symb,MODE_SPREAD);4 строка - тем же способом задаем переменную a и присваиваем ей значение ask на данной паре.5 строка - то же, но теперь присваиваем кол-во цифр после десятичной точки в котировке.6 строка - значение 1 пункта.7 строка - задаем переменную тейкпрофита double tp.8 строка - к переменной комментариев добавляем da + "Ha" + symb; в коментах для пары GBPUSD это будет выглядеть так: "На GBPUSD" без ковычек.9 строка - проверяем верно ли work = true. напомню, если верно, то ордера открываются, если нет, то нет :) обратите внимание что в условии work==true стоит два знака равенства. дело в том что условие проверяется двумя знаками например !=. >= и т.п. поэтому в условии нужно ставить два знака. даже если они повторяются... исключением являются знаки > < . они ставятся по одному.10 строка - задаем переменную которая будет считать ордера выставленные на паре.11 строка - проверяем, есть ли выставленные ордера вообще.12 строка - так как ордера проверяются общие по всему терминалу, то нам нужно из всех найти нужные нам ордера - выставленные советником. поэтому задаем цикл for , задаем любую переменную t , присваиваем ей 0. далее пишем t<OrdersTotal() это значит что цикл будет работать пока t не станет равной OrdersTotal() то есть кол-ву всех ордеров. и соответственно в конце счетчик, увеличивающий t каждый круг цикла.13строка - выбираем ордер OrderSelect(t,SELECT_BY_POS,MODE_TRADES); думаю всем понятно что OrderSelect - функция выбора ордера :) далее идет наша t, которая постоянно увеличивает, поэтому все ордера выбирутся в свое время. SELECT_BY_POS значит что нужно выбирать по позиции . есть еще вариант выбрать по тикету. но мы не знаем тикетов всех ордеров. да и нам это пока не нужно. далее MODE_TRADES значит что выбираем только среди тех ордеров, которые в данный момент открыты. если это не указывать то функция будет также выбирать ордера которые уже закрыты и записаны в историю счета :)14 строка - проверяем принадлежность ордера к нашей паре. если верно то15 строка - если магическое число ордера равно 853 (далее в след. кусочке кода увидите что когда советник выставляет ордера, он присваивает им магическое число равное 853, чтобы советник мог их же и найти в этой строчке)16 строка - задаем новую переменную op и присваиваем ей OrderOpenPrice() то есть цену открытия ордера. так как цикл наш идет с 0 и вверх до общего кол-ва ордеров, то если ордеров несколько на нужной нам паре и все открыты советником, в переменную op запишется цена открытия именно последнего ордера. что мне и нужно.17 строка - так как ордер нашелся нужный, то к счетчику ордеров добавляем 1 :)открытие ордеров будет дальше в след. кусочке кода.
Николай AlKaZaR Мануйлов
3 дек 2009 в 10:31
if (op!=0){if (a < op && op-a >=50*p){RefreshRates();tp = a + 50*p;OrderSend(symb,OP_BUY,Lot,a,3,0,tp,"",853,0,Blue);tot++;}}else{tp = a + 50*p;OrderSend(symb,OP_BUY,Lot,a,3,0,tp,"",853,0,Blue);tot++;}}if (tot==1)da = da + " " + tot + " ордер.";if (tot>1 && tot<5)da = da + " " + tot + " ордера.";if (tot>4)da = da + " " + tot + " ордеров.";da = da + " прибыль = " + DoubleToStr(profit,2);return(da);}
Николай AlKaZaR Мануйлов
3 дек 2009 в 10:46
последний кусок из моего маленького советника :) не смотрите на то что он мал. так как я описал одной функцией работу всех пар. этот советник за 1 каждый старт работает дольше чем любой другой советник :) ну приступим к объяснению :1 строка. после нахождения наших ордеров (2 кусок) мы ставим условие. если ордер есть (op!=0) (цена открытия не равна 0) то действуем далее2 строка - условие если цена ask меньше цены открытия нашего ордера и если цена открытия выше аска на 50п, то3 строка - обновляем все данные4 строка - задаем тейкпрофит = аск + 50п5 строка - соответственно выставляем ордер (symb,OP_BUY,Lot,a,3,0,tp,"",853,0,Blue) - по порядку 1-символ(пара),2 - операция бай, лот, цена аск (так как бай делается по аску а селл по биду), максимальное отхождение цены =3, стоплосс = 0, тейкпрофит, комменты, магическое число 853, срок истеченеия ордера = 0, цвет синий (будет отображаться в терминале открытие ордера синей стрелочкой в том месте где открыт ордер)6 строка - счетчик ордеров увеличиваем на 1.7 строка - если ордеров все таки не оказалось при нашей проверке, то8 строка - задаем тейкпрофит9 строка - открываем такой же ордер10строка - счетчик увеличиваем на 1.11 строка - делаем проверку сколько у нас всего накрутил счетчик ордеров на одной паре. если 1 ордер то12 строка - в коментах пишем "1 ордер"13 строка - если ордеров больше 1 и меньше 5, то14 строка - пишем в коментах tot + "ордера" (например "3 ордера")15 строка - если ордеров больше 4 , то пишем tot + "ордеров"16 строка - я там изменил чуть чуть код за вчерашний день, поэтому этот советник показывает еще баланс вашего депо, валюту вашего депо, общую прибыль со всех ордеров и прибыль ордеров с 1 пары. в 16 строке как раз в коменты добавляется прибыль ордеров с одной пары.17 - выход из пользовательской функции.вот и все. небольшой советник, но большие возможности :)в общем если есть вопросы , спрашивайте. далее будет другой советник :)
Айдар Акашев
3 дек 2009 в 11:00
Николай,а вы этот свой советник тестировали на демке ил реале?И еще вопрос,он у вассам ведет торговлю или просто дает сигналы?
Николай AlKaZaR Мануйлов
3 дек 2009 в 11:16
этот советник я тестирую на демо пока что. я его написал в воскресенье. торгует сам. просто включаю терминал (советник там уже стоит) и занимаюсь своими делами, иногда заглядываю проверить как там у него "дела" :))
Айдар Акашев
3 дек 2009 в 11:22
И как результаты за три дня?)))Кстати,на истории как себя он показал?А что сам торгует мне лично не очень,я в Румусе работаю в Форексклабе.В Альпари,что ли параллельно счет открыть...
Николай AlKaZaR Мануйлов
3 дек 2009 в 11:33
советники которые я пишу рассчитаны на 4 знака после десятичной точки в котировках. специально для альпари нужно переделывать.(но эт недолго).результаты за тря дня +427 пунктов. на истории из 10 пар, на всех кроме одной сделал прибыль хорошую. но на одной слил 200баксов лотом 0.1в румусе советников нету на сколько я знаю. советники что я пишу работают тока в мт4. сразу говорю - не пытайтесь по моим кусочкам в этой теме воссоздать советник. лучше попросите у меня полный исходник :)
Айдар Акашев
3 дек 2009 в 12:01
+427???Прямо Грааль))).А по истории на каком промежутке времени тестировали?На каких таймфреймах?Насчет Румуса вы неправы,там советники есть,есть и язык их написания.А по вашим кусочкам - это демо-версия,так сказать?А как можно получить полный исходник?)
Николай AlKaZaR Мануйлов
3 дек 2009 в 12:09
на данный момент уже +526п.Айдар читайте внимательно что я писалсоветник работает на пАрах , которые вы видите в первой строчке кода, открываются сделки buy лотом указанным во второй строчке и с тейкпрофитом в 50п. далее куда бы ни пошла цена, через каждые 50п выставляется также ордер buy с такими же данными... и так на 10 пАрах сразу...он плюсует только потому что он открыавется всегда в одну сторону, причем без стоп лосса. поэтому если цена уходит вниз, то ордер остается и не закрывается. на данный момент у меня 526п прибыли за три дня и ордера висят в - 9п. вчера было 270п прибыли и вислело в -340. но как видите цена вернулась и все получилось чудесно. тестировать этот советник я буду долго перед тем как закинуть на реал. получить полный исходник можно у меня через асю или скайп. могу еще подумать и может быть в группу буду закидывать
Игорь IG (ещё ищу) Каява
вчера в 1:44
это что то вроде системы мартингейла, только без увеличения размера лота. ну да ладно, сдесь мы о технических особенностях работы языка говорим.Спасибо Николай AlKaZaR Мануйлов, читаю с большим интересом.
Николай AlKaZaR Мануйлов
вчера в 1:46
всегда рад :) каждый день будут новые коды :) завтра начну выкладывать мультивалютный советник по форекс смарту. большой он :) на недельку хватит наверно :)
Николай AlKaZaR Мануйлов
вчера в 11:42
extern string symbol = "EURUSD";extern double Lot = 0.1;bool stoc80=false, stoc20=false;int close = 0;//-----------------------------------int init(){start();return;}//-----------------------------------int start(){int ds = ((StringLen(symbol)+1)/7);string da = "Введите пары, по которым нужно работать";int c = 0;for (int z=0; z<ds; z++){da = da + "\n";string sb = StringSubstr(symbol,c,6);da = da + sb;da = da + delay(sb);c = c + 7;}Comment(da);return;}
Николай AlKaZaR Мануйлов
вчера в 12:01
чтож , начинаю выкидывать мультивалютный советник по форекс смарту. поехали:1 строка - задаем строковую переменную symbol. она будет отображаться в параметрах советника в терминале. и каждый юзер сможеш добавить в эту строку любую пару по которой он хочет работаеть, причем хоть сколько.2 строка - задаем переменную лота.3 строка - так как страта форекс смарт опирается на индюки. нам понадобятся индюки. в данной строке я написал две глобальные переменные типа bool (прада или ложь). они будут показывать, пересекал ли стохастик уровень 80 или 20.4 строка - int close = 0 - эт не обращайте внимания, я это должен был удалить да забыл :)5 строка - задаем стандартную функцию int init(). и в ней же даем направление на главную функцию start(). я так сделал, потому что не хочу ждать пока будет тик. чтобы при загрузке советника, все сразу сработало.6 строка - после //-------- начинаем главную функцию start7 строка - задаем переменную которая будет считать, сколько символьных пар юзер ввел в строку1. функция StringLen(symbol) - вычисляет сколько символов в текстовом параметре symbol в данный момент это 6 символов. так как у меня там формула +1)/7 это значит что к 6 символам прибавляем 1 и делим на 7. получаем единицу. как раз 1 символьная пара у нас и записана.8 строка - задаем переменную комментов. как и в прошлом советнике переменная носит название "da" :) и для понимания юзерам пишем чтоб они ввели пары.9 строка - задаем переменную "с". переменная с будет использоваться в цикле для установки печатной каретки в то место откуда надо считать символьные пары. дальше будет понятнее )10 строка - задаем цикл. цикл будет работать столько, сколько пар юзер вписал строку. в данный момент цикл совершит только 1 круг.11 строка - к переменной комментов прибавляем перевод на новую строка "\n" чтоб слова не путались и удобнее было читать12 строка - задаем строковую переменную sb. ей будет присвоено значение функции StringSubstr(symbol,c,6). это общая функция. она из текста symbol начиная с "с" символа (например с ноля или с седьмого символа на втором круге цикла),берет 6 символов. в общем в данный момент значение sb будет EURUSD.13 строка - прибавляем к комментам значение sb чтобы пользователь знал, с какой парой работает советник.14 строка - к коментам добавляем то, что вернет нам пользовательская функция delay(sb). в этой функции я описал работу для любой пары, поэтому значение пары передается в скобках функции, для работы с ней.15 строка - прибавляем к "с" семь, чтобы на след круге цикла вычислить вторую пару, если таковая есть15 строка - после завершения всей работы, показываем коммент.и заканчиваем работу советника на этом тике и ждем следующий тик :)надеюсь всем все понятно :) если что спрашивайте :)
Николай AlKaZaR Мануйлов
сегодня в 11:15
string delay(string symb){string da = "";double ma00,ma01,ma10,ma11;bool mab = false, mas = false;for (int v=5; v>0; v--){ma00 = iMA(symb,PERIOD_H4,8,0,MODE_LWMA,PRICE_TYPICAL,v-1);//fast ma 0 svechama01 = iMA(symb,PERIOD_H4,21,0,MODE_LWMA,PRICE_TYPICAL,v-1);//slow ma 0 svechama10 = iMA(symb,PERIOD_H4,8,0,MODE_LWMA,PRICE_TYPICAL,v);//fast ma 1 svechama11 = iMA(symb,PERIOD_H4,21,0,MODE_LWMA,PRICE_TYPICAL,v);//slow ma 1 svechaif (ma10 < ma11 && ma00 > ma01){mab = true;mas = false;}if (ma10 > ma11 && ma00 < ma01){mas = true;mab = false;}}
Николай AlKaZaR Мануйлов
сегодня в 11:23
продолжаем разбор мультивалютного советника по форекс смарту.1 строка - пользовательская функция delay(string symb). string в самом начале значит что функция будет возвращать текст. и в скобках тоже текст. (символьная пара)2 строка - задаем переменную комментов.3 строка - задаем переменные по МА. 4 переменные - быстрая и медленная на 1 свече, быстрая и медленная на 0 свече (данная).4 строка - задаем переменные типа "правда ложь" mab - критерий ма на покупку .mas - критерий ма на продажу.5 строка - задаем цикл для пяти свечей. смысл таков: если в последние пять свечей ма пересекались, то это является сигналом , если остальные индикаторы в течение этих пяти свечей тоже подали сигнал.6 строка - находим значение быстрой МА на нужном символе. период Н4, на последней свече.7 строка - находим значение медленной МА на последней свече.8 строка - находим значение быстрой МА на предпосл свече.9 строка - находим значение медленной МА на предпосл свече.10 строка - если быстрая МА 1 свечи была меньше медленной МА 1 свечи И быстрая МА 0 свечи больше медленной МА 0 свечи, то это пересечение МА на покупку. mab присваиваем ТРУ (правда) mas присваиваем фалс (ложь)11 строка - аналогично на продажу. mas присваивае ТРУ(правда) mab присваиваем ФАЛС(ложь).
0 коммент.:
Отправить комментарий