приключения новичка - страница 3

 
niko:

Спасибо, cloudbreaker! Это начинает делать немного веселее, я не знал, что можно вызвать функцию внутри return (хотя это наверняка есть в книге по mql, как и все остальное теоретическое). Хорошо выглядит вертолет EC 155! Почему 'с благодарностью', ты не хочешь свой собственный вертолет?

Вопрос Aero HC2:


На данный момент у меня есть 3 скрипта для моей стратегии. 2 - однонаправленные, 1 - двунаправленный (над которым мы здесь и работаем).

Исходя из вашего опыта работы с MT4, стоит ли мне ожидать серьезных проблем, если я прикреплю разные скрипты к 5 или около того пар на экране (1 скрипт на пару). Это будет проще для меня, чем программировать или изменять 1 большой скрипт и заставлять его выбирать нужную мне пару (так как это потребует ежедневных изменений в коде)?

 
niko:

Вопрос Aero HC2:


На данный момент у меня есть 3 скрипта для моей стратегии. 2 - однонаправленные, 1 - двунаправленный (над которым мы здесь и работаем).

Исходя из вашего опыта работы с MT4, стоит ли мне ожидать серьезных проблем, если я прикреплю разные скрипты к 5 или около того пар на экране (1 скрипт на пару). Это будет проще для меня, чем программировать или изменять 1 большой скрипт и заставлять его выбирать нужную мне пару (так как это потребует ежедневных изменений в коде)?

Предполагая, что мы говорим об одной торговой стратегии для всех валютных пар:-.

Я предпочитаю, чтобы мои советники не зависели от пары - т.е. один и тот же EX4 может быть подключен к любой паре.

-Таким образом, нам нужно поддерживать только одну кодовую базу.

-Логика остается максимально простой.

 
cloudbreaker:

Предполагая, что мы говорим об одной торговой стратегии для всех валютных пар:-.

Я предпочитаю делать свои советники парно-агностическими - т.е. один и тот же EX4 может быть подключен к любой паре.

-Таким образом, нам нужно поддерживать только одну кодовую базу.

-Логика остается максимально простой.

Да, это было бы идеально, но я устанавливаю ручной фильтр для каждой валюты каждый день, а не на основе индикаторов, плюс получается 3 стратегии, хотя идея одна и та же. Это сделает код очень большим в моем понимании и громоздким для ежедневной настройки, если мы соберем все вместе. В ближайшем будущем я буду программировать фильтр, чтобы сократить время работы, но всегда есть вещи, которые нельзя запрограммировать (90% должно быть запрограммировано, остальное - это то, для чего нужен мозг, я думаю. Хотя я гнался за "святым Граалем", прежде чем попытаться запрограммировать все и придумать идеальную модель, хаха, не в том направлении смотрю).


Я запущу эти 2 стратегии в реальном времени в этот понедельник, так как код по ним уже готов. Они были выполнены вручную моим тестем и мной немного, кодирование должно принести более высокие результаты. Для комбинированной стратегии я могу запустить 2 советника на том же графике (один для длинных, другой для коротких), но я все еще хочу учиться, поэтому продолжу процесс кодирования. Так что ждите много вопросов в ближайшее время!


В какой стране вы находитесь? Я нахожусь в Лондоне, Великобритания.

 

Привет cloudbreaker и другие гуру mt4 здесь!


Вопрос: У меня есть 2 скрипта (один на покупку, другой на шорт). Я хотел использовать оба сегодня на 3 парах. Так как к одному графику можно прикрепить только 1 советника, я открыл 6 графиков (по 2 на пару) и прикрепил к ним скрипты. Однако, только 1 скрипт был выполнен. Я понятия не имею почему. Помогите, пожалуйста.


Итак, подведем итоги: 2 советника, один просто покупает, другой просто шортит, очень простые правила (золотой крест на emas и все), профит тейк 20 пунктов, стоп лосс отсутствует. Почему исполняется только один? Я проверил, что советники активированы, и все скрипты имеют улыбающиеся лица рядом с ними на графиках.

 
niko:

Привет cloudbreaker и другие гуру mt4 здесь!


Вопрос: У меня есть 2 скрипта (один на покупку, другой на шорт). Я хотел использовать оба сегодня на 3 парах. Так как к одному графику можно прикрепить только 1 советника, я открыл 6 графиков (по 2 на пару) и прикрепил к ним скрипты. Однако, только 1 скрипт был выполнен. Я понятия не имею почему. Помогите, пожалуйста.


Итак, подведем итоги: 2 советника, один просто покупает, другой просто шортит, очень простые правила (золотой крест на emas и все), профит тейк 20 пунктов, стоп лосс отсутствует. Почему исполняется только один? Я проверил, что советники активированы, и все скрипты имеют улыбающиеся лица рядом с ними на графиках.



Что написано в лог-файлах? Т.е. в каталоге logs и в каталоге experts?

Получаете ли вы какие-либо сообщения "Торговый контекст занят"? Если да, то я бы рекомендовал добавить некоторую логику, использующую функцию IsTradeAllowed().

Если нет, то я бы рекомендовал засорить ваш советник операторами Print().

 
cloudbreaker wrote >>

Что говорится в лог-файлах? т.е. в каталоге logs и в каталоге experts?

Получаете ли вы сообщения "Торговый контекст занят"? Если да, то я бы рекомендовал добавить некоторую логику, использующую функцию IsTradeAllowed().

Если нет, то я бы рекомендовал засорить ваш советник операторами Print().

Привет, cloudbreaker! Спасибо, что пришел на помощь!

1. Что вы имеете в виду под директорией журнала? Как мне добраться до обоих? (Я пытался открыть его через C>ProgramFiles>MT4>Experts>Logs, но папка пуста).

 
niko wrote >>

привет, тучегон! спасибо, что пришел на помощь!

1. Что значит каталог журнала? Как мне добраться до обоих? (Я пытался открыть его через C>ProgramFiles>MT4>Experts>Logs, но папка отображается пустой).

Привет, Облаковед!

Я уже много раз просматривал твои комментарии по кодированию (все они у меня на стене), пытаясь понять и соединить все это вместе, но все еще совершенно потерян. Насколько я понял, я скопировал функцию MyOrderCount из другого советника, но все еще не знаю, как интегрировать ее в код. Я совершенно не в своей тарелке, но это не значит, что мы не можем продвинуться вперед. Если бы вы могли помочь мне собрать код по кусочкам (и направить меня на более конкретные вещи, которые я мог бы сделать сам), тогда мы сделаем код, и я научусь гораздо быстрее.

Я приложил код, насколько я с ним справился, а также карту проектирования программы, как я ее вижу. Не беспокойтесь о таких мелочах, как скобки в коде, я проверю их в Notepad++ по ходу дела.

Ключевой приоритет, если бы вы могли помочь мне шаг за шагом интегрировать код MyOrderCount в остаток, и, пожалуйста, объясняйте все понемногу по ходу дела. Вы также можете направить меня к определенным частям книги или чему-либо подобному, если вы считаете это уместным. Так мы продвинемся гораздо быстрее.

Спасибо!

ps: дайте мне знать, если карта программы не прикрепилась

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
if(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }
  //-------------------Declaring All Variables and Conditions

double ema1,ema2,ema3,closeup, e1over2, e2over3,e1under2,e2under3;

ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
e1under2=ema1<ema2;
e2under3=ema2<ema3;
e1over2=ema1>ema2;
e2over3=ema2>ema3;
//--------------------declaration end

//-------------order counting code
int CalculateNumberOfOrders(string Symbol)
{
int long=0,short=0;
for(int i=0;i<OrdersTotal();i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
      if(OrderType()==OP_BUY)long++;
      if(OrderType()==OP_SELL)sell++;
     {
  //---return orders Volume
  if(long>0)return(long);
  if(short>0)return(short);
{
//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//------------------EURUSD Block-------------------------
//check order type, if it doesn't equal to buy already then buy
if(OrderType()
     {
    static int ticket;
      // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
       {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"Short
Order ",0,0,Red);
        if(ticket>0)
              {
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SHORT order opened : ",OrderOpenPrice());
              }
              //return(0);
       }

      //  -------------------------------------------------------------------------------------------

      {
      static int ticket1;
            // deleted if(OrdersTotal()==0)
        if(e1over2 && e2over3) //buy function
        {
         ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green);
//What's 12345 for? I ADDED ASk-30*Point for stop loss
         if(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
           }
           //return(0);   //the problem is with this return not being
in the right place i think
        }
      }
return(0);
}
}

ps: пожалуйста, не обращайте внимания на случайные // комментарии в коде, они из старых записей

 
niko wrote >>

Привет, cloudbreaker!

Я уже много раз просматривал ваши комментарии по кодированию (все они у меня на стене), пытаясь понять и соединить все это вместе, но все еще полностью потерян. Насколько я понял, я скопировал функцию MyOrderCount из другого советника, но все еще не знаю, как интегрировать ее в код. Я совершенно не в своей тарелке, но это не значит, что мы не можем продвинуться вперед. Если бы вы могли помочь мне собрать код по кусочкам (и направить меня на более конкретные вещи, которые я мог бы сделать сам), тогда мы сделаем код, и я научусь гораздо быстрее.

Я приложил код, насколько я с ним справился, а также карту проектирования программы, как я ее вижу. Не беспокойтесь о таких мелочах, как скобки в коде, я проверю их в Notepad++ по ходу дела.

Ключевой приоритет, если бы вы могли помочь мне шаг за шагом интегрировать код MyOrderCount в остаток, и, пожалуйста, объясняйте все понемногу по ходу дела. Вы также можете направить меня к определенным частям книги или чему-либо подобному, если вы считаете это уместным. Так мы будем продвигаться гораздо быстрее.

Спасибо!

ps: дайте мне знать, если карта программы не прикрепилась

ps: пожалуйста, не обращайте внимания на случайные // комментарии в коде, они из старых записей.

Привет Нико

Могу ли я добавить свои два пенса к этой дискуссии,

Как старый, практически антикварный :), программист с небольшим опытом преподавания и обучения, я столкнулся с довольно большим количеством плохого кода в свое время. Одна из распространенных ошибок, которая приводит к плохому написанию кода, - это отсутствие планирования. Возможно, это очевидное утверждение, но вам действительно необходимо определить, что вы хотите сделать, прежде чем приступать к написанию кода. Это может показаться дополнительной работой, но в конечном итоге это сэкономит вам массу времени и позволит получить более надежный, более понятный и легко поддерживаемый код.

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

Вот пример псевдокода для приготовления сыра и макарон. Я взял его из статьи "Intro to Programming by Patrick Nouvion" на сайте IBFX. Возможно, стоит прочитать всю статью. http://www.ibfx.com/ibfxu/catalog/programming/pro1010.aspx

НАЧНИТЕ
Найдите молоко, масло и коробку с крафтом
Если нашли, продолжайте
иначе отправьте ребенка в магазин

Найти кастрюлю в шкафу

Если найдется, попросите жену помочь найти его.

Найти плиту
Если найдена, продолжайте
иначе заказать пиццу

Проверьте наличие свободной конфорки
Если есть, продолжайте
else make avail

Включите плиту на высокий уровень
Найдите воду
Если вода найдена, продолжайте
иначе заказать пиццу

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

Поставьте кастрюлю на конфорку
если у вас есть соль, добавьте щепотку соли
если нет, продолжайте
если есть перец добавьте щепотку перца
если нет, продолжайте
пока вода не закипела, подождите
откройте крафтовую коробку
добавьте макароны из коробки в кастрюлю
подождите 8 минут
во время ожидания, если кастрюля закипит, убавьте огонь и подуйте на нее.
найдите дуршлаг
Слейте воду из макарон в дуршлаг
вернитесь в кастрюлю
добавьте содержимое пакета с сыром
добавить масло
добавить 1 столовую ложку молока
перемешать до однородности
если суп слишком густой, добавьте 1 столовую ложку молока; если нет, ешьте.
КОНЕЦ

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

НАЧАЛЬНЫЙ БЛОК - Подготовить кипящую воду

Положить воду в кастрюлю

Поставьте кастрюлю на конфорку
если у вас есть соль, добавьте щепотку соли
если нет, продолжайте
если есть перец, добавьте щепотку перца
если нет, продолжайте
пока вода не закипела, подождите

КОНЕЧНЫЙ БЛОК - Подготовить кипящую воду

и так далее....

Нико, я одобряю ваше желание научиться писать свой собственный код. По моему опыту, самый быстрый и простой способ научиться - это делать то, что вы делаете, и просто попробовать. Однако я бы предложил вам сделать небольшой шаг назад и написать то, чего вы хотите достичь, в псевдокоде. Это поможет вам ясно представить, чего именно вы хотите добиться.

После этого вы можете опубликовать его здесь, чтобы я или кто-то другой взглянул на него. После того, как у вас есть псевдокод, вы можете начать конвертировать его в код MT4. Пытаться сделать все это за один раз - слишком большой прыжок, особенно если вы новичок.

Кстати, мой псевдокод никогда не пропадает зря. Большая часть его заканчивается в виде комментариев в моем готовом коде.

Удачи!

Тим Уилсон

 
niko:

Привет, cloudbreaker!

Я уже много раз просматривал ваши комментарии по кодированию (все они у меня на стене), пытаясь понять и соединить все это вместе, но все еще совершенно потерян. Насколько я понял, я скопировал функцию MyOrderCount из другого советника, но все еще не знаю, как интегрировать ее в код. Я совершенно не в своей тарелке, но это не значит, что мы не можем продвинуться вперед. Если бы вы могли помочь мне собрать код по кусочкам (и направить меня на более конкретные вещи, которые я мог бы сделать сам), тогда мы сделаем код, и я научусь гораздо быстрее.

Я приложил код, насколько я с ним справился, а также карту проектирования программы, как я ее вижу. Не беспокойтесь о таких мелочах, как скобки в коде, я проверю их в Notepad++ по ходу дела.

Ключевой приоритет, если бы вы могли помочь мне шаг за шагом интегрировать код MyOrderCount в остаток, и, пожалуйста, объясняйте все понемногу по ходу дела. Вы также можете направить меня к определенным частям книги или чему-либо подобному, если вы считаете это уместным. Так мы будем продвигаться гораздо быстрее.

Спасибо!

ps: дайте мне знать, если карта программы не прикрепилась

ps: пожалуйста, не обращайте внимания на случайные // комментарии в коде, они из старых записей.

Быстрый взгляд подсказывает мне, что вы совершаете фундаментальную ошибку.

Похоже, вы пытаетесь объявить функцию MyOrderCount() в кодовом блоке функции start().

Представьте ваш код как серию функций init(), start(), yourfunction1(), yourfunction2() ... yourfunctionN().

Функции init() и start() - это специальные функции. Функция init() выполняется один раз при первой инициализации советника. Функция start() запускается каждый раз, когда приходит входящий тик.

Таким образом, функция start() формирует корень, из которого будет вызываться вся ваша логика, когда советник будет запущен.

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

- проверить некоторые условия

- если условия выполнены, выполнить ордер

Одно из условий, которое вам нужно, - это убедиться, что у вас еще нет ордера данного типа (скажем, buy), прежде чем вы выставите ордер на покупку.

Поэтому из функции start() вам нужно будет выяснить, какие ордера на покупку существуют, вызвав функцию подсчета ордеров на покупку (кодовый блок которой находится ВНЕ функции start()).

Ваша функция подсчета ордеров вернет количество ордеров на покупку, и вы возобновите выполнение функции start() на строке после вызова функции подсчета ордеров на покупку.

Затем вы будете использовать значение, возвращенное функцией подсчета ордеров на покупку, чтобы определить, исполнять или нет ваш ордер на покупку.

Фактическое исполнение ордера на покупку может быть вызовом ДРУГОЙ функции, которую вы создадите для себя (опять же, объявленной вне функции start()).

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


CB

 

Привет TSWilson и CB!

Вы, ребята, замечательные! Огромное вам спасибо.

Совершенно верно насчет псевдокода. Я делал это, когда занимался очень базовым программированием на языке pro**realtime, но там все было так просто, никаких деклараций, никаких блоков и т.д. (весь код был просто "if...then", хаха). Я начал псевдокод сегодня утром (пришел на работу на час раньше, чтобы сделать это) и написал визуальную схему того, как и какие блоки должны быть. Я закончу ее сегодня позже и выложу здесь.

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

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

Так что следите за этой темой сегодня, я выложу псевдокод и диаграмму!

И как всегда, спасибо Вселенной за таких людей, как вы!

Причина обращения: