VAZHAF Опубликовано 14 августа, 2008 Жалоба Поделиться Опубликовано 14 августа, 2008 Привет всем!Вопрос по поводу MF_Pivot AXEL 0-3255.Он показывает только сам Pivot (пунктиром). По коду расчёт Pivotа - общий для всех сессий, только выбирается HLC нужного промежутка времени. Добавил код для построения параллельных линий уровней R1, R2, R3 и S1, S2, S3. Получилась ерунда… На рисунке видно. Сейчас я в тупике. Может я пытаюсь сделать невозможное, раз авторы этого не сделали?С уважением, ЛЮКС.P.S. Это моё первое сообщение, прошу прощение, если что-то не корректно. http://img225.imageshack.us/img225/191/200808141409ab3.gifНе изобретайте велосипед. Примеров готовых пивотов можно найти в MQL4 Code Base - Каталог советников, индикаторов, скриптов и библиотек кода есть и простые, как в этом файле.Pivot.zip Ссылка на комментарий Поделиться на другие сайты Поделиться
ЛЮКС Опубликовано 14 августа, 2008 Жалоба Поделиться Опубликовано 14 августа, 2008 Привет всем!Вопрос по поводу MF_Pivot AXEL 0-3255.Он показывает только сам Pivot (пунктиром). По коду расчёт Pivotа - общий для всех сессий, только выбирается HLC нужного промежутка времени. Добавил код для построения параллельных линий уровней R1, R2, R3 и S1, S2, S3. Получилась ерунда… На рисунке видно. Сейчас я в тупике. Может я пытаюсь сделать невозможное, раз авторы этого не сделали?С уважением, ЛЮКС.P.S. Это моё первое сообщение, прошу прощение, если что-то не корректно. http://img225.imageshack.us/img225/191/200808141409ab3.gifНе изобретайте велосипед. Примеров готовых пивотов можно найти в MQL4 Code Base - Каталог советников, индикаторов, скриптов и библиотек кода есть и простые, как в этом файле. Спасибо за отклик. Готовых пивотов действительно много, только они не меняют свои показания в течение дня в отличие от MF_Pivot AXEL 0-3255. А те старые велосипеды уже наизобретал - иногда пользуюсь. Ссылка на комментарий Поделиться на другие сайты Поделиться
docspectre Опубликовано 28 сентября, 2008 Жалоба Поделиться Опубликовано 28 сентября, 2008 Добрый день. Нужен простой советник который бы открывал позицию при пересечении 2 МА и закрывал позицию при при обратном пересечении с одновременным открытием противоположной позиции. Без стоп лоссов, ТР и доливок. Пытался найти в просторах нета ничего подобного не нашел. Пытаюсь сделать самостоятельно но он не работает. Может кто нибудь глянет и подскажет чего не так. Код прилагается. //+------------------------------------------------------------------+//| Mar.mq4 |//| Copyright © 2008, MetaQuotes Software Corp. |//| http://www.metaquotes.net |//+------------------------------------------------------------------+ extern double Lots = 0.1; // Это переменные, которые будут // отображаться во время// соединения эксперта с графиком //+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int start(){double MA_Fast,MA_Low; int total, ticket, cnt; // Просто переменные для использования в программе // присвоение переменным значений MA_Fast=iMA( NULL, 0, 1, 0, MODE_SMA, PRICE_TYPICAL, 1); // быстрая МАMA_Low=iMA( NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1); // медленная МА if(Bars<100) {Print("bars less than 100");return(0); }// Это условие проверяет, есть ли в истории графиков более 100 свечей и если нет, // выдает ошибку. Требуется для того, чтобы обратить ваше внимание на проблему // недостатка информации total=OrdersTotal();if(total<1) // Эта проверка нужна для того, чтобы не открывать сразу нескольких одинаковых позиций. Если ее не будет, то, скажем, если ваш эксперт срабатывает, когда стохастик находится в зоне перекупленности, то он будет совершать сделку на каждом тике, пока не истратит всю маржу. // Поэтому, чтобы ограничить количество открываемых позиций, ставят данный // ограничитель. Если он стоит, то советник не будет открывать более определенного // количества позиций <х{// no opened orders identifiedif(AccountFreeMargin()<(1000*Lots)) {Print("We have no money. Free Margin = ", AccountFreeMargin());return(0); }// Еще один вспомогательный кусок кода. Если средств на счете недостаточно, он // выдаст ошибку. Данный кусок полностью бесполезен, если советник работает // в реальном времени, но очень полезен при тестинге на истории. { OrderSelect(OrdersHistoryTotal( )-1, SELECT_BY_POS, MODE_HISTORY); // открытие длинной позиции if(MA_Fast>MA_Low && OrderProfit()>=0) { ticket=OrderSend(Symbol(),OP_BUY,Lots*1,Open[0],3,0,"покупка",16384,0,Green); if(ticket>0) {if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());}else Print("Error opening BUY order : ",GetLastError());return(0); } // открытие короткой позиции if(MA_Fast<MA_Low && OrderProfit()>=0) { ticket=OrderSend(Symbol(),OP_SELL,Lots*1,Open[0],3,0,"продажа",16384,0,Red); if(ticket>0) {if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());}else Print("Error opening BUY order : ",GetLastError());return(0); } // Наконец, мы добрались до самого интересного. Вместо этих иксов, надо вставить // условие, при котором происходит покупка. // Этот блок нужен только для того, чтобы записать в журнале, все ли прошло гладко. // Или, в противном случае, записать ошибку, из-за которой что-то не получилось. // Теперь о выходе. Тут также ничего не изменилось, просто RRRRRRR - условие // закрытия сделки по BUY, ZZZZZZZZ - по SELLreturn(0); }total=OrdersTotal(); for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(MA_Fast<MA_Low) { OrderClose(OrderTicket(),OrderLots(),Open[0],5,Red); return(0); } } } if(OrderType()==OP_SELL) { if(MA_Fast>MA_Low) { OrderClose(OrderTicket(),OrderLots(),Open[0],5,Red); return(0); } } } } return(0);} Он не открывает ни одной позиции. Заранее спасибо Ссылка на комментарий Поделиться на другие сайты Поделиться
docspectre Опубликовано 28 сентября, 2008 Жалоба Поделиться Опубликовано 28 сентября, 2008 Если меняю вот этот кусок ticket=OrderSend(Symbol(),OP_BUY,Lots*1,Open[0],3,0,"покупка",16384,0,Green);на вот этотticket=OrderSend(Symbol(),OP_BUY,Lots*1,"покупка",16384,0,Green);То он открывает 1 позу по бай и не закрывает ее. Ссылка на комментарий Поделиться на другие сайты Поделиться
Shu Опубликовано 29 сентября, 2008 Жалоба Поделиться Опубликовано 29 сентября, 2008 Добрый день. Нужен простой советник который бы открывал позицию при пересечении 2 МА и закрывал позицию при при обратном пересечении с одновременным открытием противоположной позиции. Без стоп лоссов, ТР и доливок. Пытался найти в просторах нета ничего подобного не нашел. Пытаюсь сделать самостоятельно но он не работает. Может кто нибудь глянет и подскажет чего не так. Код прилагается.ой во-первых, повнимательнее проверьте параметры функции OrderSend(). во-вторых, помните, что покупки совершаются по цене Ask, а продажи по цене Bid. в-третьих, обращайте внимание на журналы. обычно там отражаются ошибки советника (если они случаются) и даётся их расшифровка (номер). по номеру легко в хэлпе найти причину сего. Ссылка на комментарий Поделиться на другие сайты Поделиться
docspectre Опубликовано 29 сентября, 2008 Жалоба Поделиться Опубликовано 29 сентября, 2008 во-первых, повнимательнее проверьте параметры функции OrderSend(). во-вторых, помните, что покупки совершаются по цене Ask, а продажи по цене Bid. в-третьих, обращайте внимание на журналы. обычно там отражаются ошибки советника (если они случаются) и даётся их расшифровка (номер). по номеру легко в хэлпе найти причину сего.Воспользовался Вашими советами и ... Помогло. Спасибо большое. А может еще подскажите как правильно написать открыться лотом равным ПОСЛЕДНЕМУ лоту. Это уже для другого советника Или где поискать можно. В хелпе не могу найти Ссылка на комментарий Поделиться на другие сайты Поделиться
Shu Опубликовано 30 сентября, 2008 Жалоба Поделиться Опубликовано 30 сентября, 2008 [Воспользовался Вашими советами и ... Помогло. Спасибо большое. А может еще подскажите как правильно написать открыться лотом равным ПОСЛЕДНЕМУ лоту. Это уже для другого советника Или где поискать можно. В хелпе не могу найтине. ве. рю. изучайте инструмент история ордеров вам доступна. если проанализировать её, то можно найти с каким лотом открывался последний ордер. отсюда и пляшите! Ссылка на комментарий Поделиться на другие сайты Поделиться
docspectre Опубликовано 1 октября, 2008 Жалоба Поделиться Опубликовано 1 октября, 2008 изучайте инструмент история ордеров вам доступна. если проанализировать её, то можно найти с каким лотом открывался последний ордер. отсюда и пляшите!Похоже меня не так поняли. мне нужно не найти последнюю сделку, а написать так чтобы последняя сделка при соблюдении определенных условий открывалась лотом равным предыдущему, а при несоблюдении открывалась первоначальным лотом. Ссылка на комментарий Поделиться на другие сайты Поделиться
Shu Опубликовано 1 октября, 2008 Жалоба Поделиться Опубликовано 1 октября, 2008 изучайте инструмент история ордеров вам доступна. если проанализировать её, то можно найти с каким лотом открывался последний ордер. отсюда и пляшите!Похоже меня не так поняли. мне нужно не найти последнюю сделку, а написать так чтобы последняя сделка при соблюдении определенных условий открывалась лотом равным предыдущему, а при несоблюдении открывалась первоначальным лотом.почему же не понял? "чтобы последняя сделка ... открывалась лотом равным предыдущему". вот. отыскиваем предыдущую сделку - и смотрим какой у неё лот.. первоначальный обычно в параметрах советника. ну и всё - смотрим условия всяческие ваши конкретные и делаем выбор.. Ссылка на комментарий Поделиться на другие сайты Поделиться
minus Опубликовано 28 октября, 2008 Жалоба Поделиться Опубликовано 28 октября, 2008 Здравсивуйте, в данный момент учу mql, сначала написал простенький советник на основе WPR, теперь пытаюсь прилепит к нему лок - не порлучается, вроде бы все делаю правильно, но советник не хочет работать как надо. Помогите реализовать советник. И объясните пожалуйста в чем моя ошибка. Основная ошибка мне кажется содержится в пятом блоке. Принцип работы таков: основной сигнал - это пробитие уровня -50, противоположную позицию (лок) открываем только в том случае, если до нынешнего сигнала,(начало отсчета прошлое пробитие wprом уровня -50) wpr не входил в одну из зон - >-20 или <-80. Раскрываяется лок соответственно и вхождением wpr в одну из этих зон и при этом закрываем соответсвующию позицию и соответсвующую оставляем.Заранее благодарен.Код://+------------------------------------------------------------------+ //| WPR.mq4 | //| Copyright © 2008, aftar Minus . | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, Minus." #property link "http://www.metaquotes.net" //+------------------------------------------------------------------1a-- extern int Period_WPR=34; // период WPR extern double Lots=0.1; // используемый лот extern double Prots=0.01; // Процент свободных средств //-------------------------------------------------------------------1b-- bool Work=true; // Эксперт будет работать. string Symb; // Название финанс. инструмента //-------------------------------------------------------------------2--- int start() { int Total; //количество ордеров в окне int Tip=-1; // Тип выбран. ордера (B=0,S=1) int Ticket; // Номер ордера double Wpr_t; //текущее значение WPR double Lot; // Колич. лотов в выбран.ордере double Lts; // Колич. лотов в открыв.ордере double Min_Lot; // Минимальное количество лотов double Step; // Шаг изменения размера лота double Free; // Текущие свободные средства double One_Lot; // Стоимость одного лота double Price; // Цена выбранного ордера bool Ans=false; // Ответ сервера после закрытия bool Cls_B=false; // Критерий для закрытия Buy bool Cls_S=false; // Критерий для закрытия Sell bool Opn_B=false; // Критерий для открытия Buy bool Opn_S=false; // Критерий для открытия Sell bool zone1=true; bool zone2=true; //--------------------------------------------------------------- 3 -- // Предварит.обработка if(Bars<Period_WPR) // Недостаточно баров { Alert("Недостаточно баров в окне. Эксперт не работает."); return; // Выход из start() } if(Work==false) // Критическая ошибка { Alert("Критическая ошибка. Эксперт не работает."); return; // Выход из start() } //--------------------------------------------------------------- 4 -- // Учёт ордеров Symb=Symbol(); // Название фин.инстр. Total=0; // Количество ордеров for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер { if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий { // Анализ ордеров: if (OrderSymbol()!=Symb)continue; // Не наш фин. инструм if (OrderType()>1) // Попался отложенный { Alert("Обнаружен отложенный ордер. Эксперт не работает."); return; // Выход из start() } Total++; // Счётчик рыночн. орд if (Total>3) // Не более одного орд { Alert("Несколько рыночных ордеров. Эксперт не работает."); return; // Выход из start() } Ticket=OrderTicket(); // Номер выбранн. орд. Tip=OrderType(); // Тип выбранного орд. Price=OrderOpenPrice(); // Цена выбранн. орд. Lot=OrderLots(); // Количество лотов } } //--------------------------------------------------------------- 5 -- // Торговые критерии int H=1000; // Колич.баров в расчётной истории int P=Period_WPR; // Период расчётной МА double WPR=iCustom(NULL,0,"WPR",P,H,0,0,1); //-------------------------// if (WPR>-50 && zone1==true) { Opn_B=true; Cls_S=true; zone1=false; zone2=false; } else { if (WPR>-50 && zone1==false && zone2==false) { Opn_B=true; { if (WPR>-20) { zone1=true; zone2=false; Cls_S=true; zone1=false; } else { if (WPR<-80) { zone2=true; zone1=false; Cls_B=true; zone2=false; } } } } } if (WPR<-50 && zone2==true) { Opn_S=true; Cls_B=true; zone2=false; zone1=false; } else { if (WPR<-50 && zone2==false && zone1==false) { Opn_S=true; { if (WPR<-80) { zone2=true; zone1=false; Cls_B=true; zone2=false; } else { if (WPR>-20) { zone1=true; zone2=false; Cls_S=true; zone1=false; } } } } } //--------------------------------------------------------------- 6 -- // Закрытие ордеров while(true) // Цикл закрытия орд. { if (Tip==0 && Cls_B==true) // Открыт ордер Buy.. { //и есть критерий закр RefreshRates(); // Обновление данных Ans=OrderClose(Ticket,Lot,Bid,5); // Закрытие Buy if (Ans==true) // Получилось :) { Alert ("Закрыт ордер Buy ",Ticket); break; // Выход из цикла закр } if (Fun_Error(GetLastError())==1) // Обработка ошибок continue; // Повторная попытка return; // Выход из start() } if (Tip==1 && Cls_S==true) // Открыт ордер Sell.. { // и есть критерий закр RefreshRates(); // Обновление данных Ans=OrderClose(Ticket,Lot,Ask,5); // Закрытие Sell if (Ans==true) // Получилось :) { Alert ("Закрыт ордер Sell ",Ticket); break; // Выход из цикла закр } if (Fun_Error(GetLastError())==1) // Обработка ошибок continue; // Повторная попытка return; // Выход из start() } break; // Выход из while } //--------------------------------------------------------------- 7 -- // Стоимость ордеров RefreshRates(); // Обновление данных Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Миним. колич. лотов Free=AccountFreeMargin(); // Свободн средства One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота Step=MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размера if (Lots>0) // Если заданы лоты,то Lts=Lots; // с ними и работаем else // % свободных средств Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия if (Lts<Min_Lot) Lts=Min_Lot; // Не меньше минимальн if (Lts*One_Lot>Free) // Лот дороже свободн. { Alert(" Не хватает денег на ", Lts," лотов"); return; // Выход из start() } //--------------------------------------------------------------- 8 -- // Открытие ордеров while(true) // Цикл закрытия орд. { if (Total==0 && Opn_B==true) // Открытых орд. нет + { // критерий откр. Buy RefreshRates(); // Обновление данных Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,0,0);//Открытие Buy if (Ticket>0) // Получилось :) { zone1=true; Alert ("Открыт ордер Buy ",Ticket); return; // Выход из start() } if (Fun_Error(GetLastError())==1) // Обработка ошибок continue; // Повторная попытка return; // Выход из start() } if (Total==0 && Opn_S==true) // Открытых орд. нет + { // критерий откр. Sell RefreshRates(); // Обновление данных Alert("Попытка открыть Sell. Ожидание ответа.."); Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,0,0);//Открытие Sel if (Ticket>0) // Получилось :) { zone1=true; Alert ("Открыт ордер Sell ",Ticket); return; // Выход из start() } if (Fun_Error(GetLastError())==1) // Обработка ошибок continue; // Повторная попытка return; // Выход из start() } break; // Выход из while } //--------------------------------------------------------------- 9 -- return; // Выход из start() } //-------------------------------------------------------------- 10 -- int Fun_Error(int Error) // Ф-ия обработ ошибок { switch(Error) { // Преодолимые ошибки case 4: Alert("Торговый сервер занят. Пробуем ещё раз.."); Sleep(3000); // Простое решение return(1); // Выход из функции case 135:Alert("Цена изменилась. Пробуем ещё раз.."); RefreshRates(); // Обновим данные return(1); // Выход из функции case 136:Alert("Нет цен. Ждём новый тик.."); while(RefreshRates()==false) // До нового тика Sleep(1); // Задержка в цикле return(1); // Выход из функции case 137:Alert("Брокер занят. Пробуем ещё раз.."); Sleep(3000); // Простое решение return(1); // Выход из функции case 146:Alert("Подсистема торговли занята. Пробуем ещё.."); Sleep(500); // Простое решение return(1); // Выход из функции // Критические ошибки case 2: Alert("Общая ошибка."); return(0); // Выход из функции case 5: Alert("Старая версия терминала."); Work=false; // Больше не работать return(0); // Выход из функции case 64: Alert("Счет заблокирован."); Work=false; // Больше не работать return(0); // Выход из функции case 133:Alert("Торговля запрещена."); return(0); // Выход из функции case 134:Alert("Недостаточно денег для совершения операции."); return(0); // Выход из функции default: Alert("Возникла ошибка ",Error); // Другие варианты return(0); // Выход из функции } } Ссылка на комментарий Поделиться на другие сайты Поделиться
JanUs5 Опубликовано 30 октября, 2008 Жалоба Поделиться Опубликовано 30 октября, 2008 Добрый вечер господа.У меня просьба - нужен звуковой сигнал на RSI при пересечений уровня 50. Сам я попробовал написать на основе примера в статье "Звуковые сигналы в индикаторах" (http://articles.mql4.com/ru/292) - но увы, багаж знаний мой в части программирования скуден и смешон... Вообщем. кто чем может- помогите. Ссылка на комментарий Поделиться на другие сайты Поделиться
arttom Опубликовано 7 ноября, 2008 Жалоба Поделиться Опубликовано 7 ноября, 2008 (изменено) то же пытаюсь написать советника: при открытии рыночного ордера необходимо звуковое сообщение (напоминание) об открытии отложенного ордера в обратном направлении. Как только отложенник открыт, соощение прекращается.void start() { if(OrderType()==OP_SELL) { PlaySound(Sound_1_up); } if(OrderType()==OP_BUY) { PlaySound(Sound_1_dn); }} как дальше сделать, Help please! Изменено 7 ноября, 2008 пользователем arttom Ссылка на комментарий Поделиться на другие сайты Поделиться
Shu Опубликовано 8 ноября, 2008 Жалоба Поделиться Опубликовано 8 ноября, 2008 то же пытаюсь написать советника: при открытии рыночного ордера необходимо звуковое сообщение (напоминание) об открытии отложенного ордера в обратном направлении. Как только отложенник открыт, соощение прекращается.void start() { if(OrderType()==OP_SELL) { PlaySound(Sound_1_up); } if(OrderType()==OP_BUY) { PlaySound(Sound_1_dn); }} как дальше сделать, Help please!скорее, не "дальше", а перед. сначала нужно выбрать ордер из списка ордеров. и потом уже сравнивать его тип с чем-то. ну, и так далее.. Ссылка на комментарий Поделиться на другие сайты Поделиться
SnowBars Опубликовано 17 ноября, 2008 Жалоба Поделиться Опубликовано 17 ноября, 2008 Помогите, пожалуйста, как можно в советнике сделать следующее: нужно открыть два отложенных ордера по очереди (так как я понимаю, что одновремменно два открыть нельзя, если ошибаюсь, то поправте), один buy, другой sell(кол-во лотов одинаковое) и в случае срабатывания одного из них, тут же удалить второй!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
selenat Опубликовано 25 декабря, 2008 Жалоба Поделиться Опубликовано 25 декабря, 2008 Здравствуйте! Сегодня написал свой первый советник. Прогоняю его на тестере стратегий и вижу, что он открывает по несколько одинаковых сделок (по одной и той же цене) в один и тот же момент времени. Если я правильно понимаю, то происходит это из-за того, что код советника выполняется при получении каждого нового тика, которых на одном баре приходит множество (советник тестирую на пятиминутном графике). Подскажите пожалуйста как избежать этого эффекта. Видимо надо сделать как-то так, чтобы алгоритм выполнялся по одному разу на каждый бар? И как это реализовать технически? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения