Новые сообщения · Участники · Правила форума · Поиск · RSS · Вход · Регистрация ·

Страница 1 из 212»
Форум трейдеров » Скрипты Советники Индикаторы для Metatrader4/Metatrader5 » MT 4 MQL программирование, помощь. » Помогите с советником.
Помогите с советником.

YurchikДата: Суббота, 14.12.2013, 15:34 | Сообщение # 1
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 5
Награды: 0
Статус: Offline


[Бонусы за сообщения ]



Добрый день. Хотел написать свой советник но что-то встал в ступор.
Т.е. создаю мартингейла в две стороны. Ордера открывает нормально с указанным шагом. А вот закрыть по общему профиту не могу. Т.е. ничего не происходит. Ошибка скорее всего в недопонимании как все функции работают. Поставьте на путь истинный пожалуйста.

Прикрепления: BUY_SELL_MARTIN.mq4(8Kb)
 
Сообщение
Добрый день. Хотел написать свой советник но что-то встал в ступор.
Т.е. создаю мартингейла в две стороны. Ордера открывает нормально с указанным шагом. А вот закрыть по общему профиту не могу. Т.е. ничего не происходит. Ошибка скорее всего в недопонимании как все функции работают. Поставьте на путь истинный пожалуйста.

Автор - Yurchik
Дата добавления - 14.12.2013 в 15:34

expforexДата: Понедельник, 16.12.2013, 10:19 | Сообщение # 2
Главный Администартор
Группа: Администраторы
Сообщений: 8959
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

Приветствую, 

Я так понял создаете ВЫ советник сами? Я вижу переменные с декомпилированного кода, ну да ладно

во первых
Вы объявляете функцию подсчета профита в Void зачем ? 

Код
[b]void Profit_SELL


нужно так:

Код
[b]double Profit_SELL


в вторых: много ошибок в функциях:

например :


 
Код
double Profit_BUY (int Magic_BUY)  
{
  int gpos484;
int ProfitBUY;
    for ( gpos484 = OrdersTotal() - 1; gpos484 >= 0; gpos484--)  
    {
       OrderSelect(gpos484, SELECT_BY_POS, MODE_TRADES);
       if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_BUY)   
          if (OrderType() == OP_BUY)
          ProfitBUY += OrderProfit();   
          Print("Профит БАЙ ордеров ", ProfitBUY);
    }
    return (ProfitBUY);
}

далее


Код
double Profit_BUY;
Profit_SELL (ProfitSELL, Magic_SELL);
Profit_BUY (ProfitBUY, Magic_BUY);
double Profit_SELL;


заменить на 


Код
double ProfitBUY;
double ProfitSELL;
ProfitSELL(Magic_SELL);
ProfitBUY=Profit_BUY (Magic_BUY);


в третьих:
TP_BUY_1= 10;      //Профит в пунктах.

Если у тебя профит в пунктах, то в функции подсчета профита надо считать в пунктах, у тебя считает в валюте депозита. и 10 не пунктов а 10 долларов получается. 

В общем это только поверхностный осмотр "пациента" 

Если у тебя есть желание НАУЧИТЬСЯ самому программировать, то пользуйся своим кодом. Не стоит копировать чужой код. Он не научит. Можно смотреть на него. Но не копировать. Иначе сам потом запутаешься.



Программирование на заказ || Наши Разработки

 
СообщениеПриветствую, 

Я так понял создаете ВЫ советник сами? Я вижу переменные с декомпилированного кода, ну да ладно

во первых
Вы объявляете функцию подсчета профита в Void зачем ? 
Код
[b]void Profit_SELL


нужно так:

Код
[b]double Profit_SELL


в вторых: много ошибок в функциях:

например :


 
Код
double Profit_BUY (int Magic_BUY)  
{
  int gpos484;
int ProfitBUY;
    for ( gpos484 = OrdersTotal() - 1; gpos484 >= 0; gpos484--)  
    {
       OrderSelect(gpos484, SELECT_BY_POS, MODE_TRADES);
       if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_BUY)   
          if (OrderType() == OP_BUY)
          ProfitBUY += OrderProfit();   
          Print("Профит БАЙ ордеров ", ProfitBUY);
    }
    return (ProfitBUY);
}

далее


Код
double Profit_BUY;
Profit_SELL (ProfitSELL, Magic_SELL);
Profit_BUY (ProfitBUY, Magic_BUY);
double Profit_SELL;


заменить на 


Код
double ProfitBUY;
double ProfitSELL;
ProfitSELL(Magic_SELL);
ProfitBUY=Profit_BUY (Magic_BUY);


в третьих:
TP_BUY_1= 10;      //Профит в пунктах.

Если у тебя профит в пунктах, то в функции подсчета профита надо считать в пунктах, у тебя считает в валюте депозита. и 10 не пунктов а 10 долларов получается. 

В общем это только поверхностный осмотр "пациента" 

Если у тебя есть желание НАУЧИТЬСЯ самому программировать, то пользуйся своим кодом. Не стоит копировать чужой код. Он не научит. Можно смотреть на него. Но не копировать. Иначе сам потом запутаешься.

Автор - expforex
Дата добавления - 16.12.2013 в 10:19

expforexДата: Понедельник, 16.12.2013, 10:19 | Сообщение # 3
Главный Администартор
Группа: Администраторы
Сообщений: 8959
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

Двухсторонний мартин:
http://www.mqlsoft.net/shop/179/desc/exp-dve-storony



Программирование на заказ || Наши Разработки

 
СообщениеДвухсторонний мартин:
http://www.mqlsoft.net/shop/179/desc/exp-dve-storony

Автор - expforex
Дата добавления - 16.12.2013 в 10:19

YurchikДата: Понедельник, 16.12.2013, 16:47 | Сообщение # 4
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 5
Награды: 0
Статус: Offline


[Бонусы за сообщения ]

Спасибо большое за помощь.
Действительно создаю сам советника.  Только вот с одним ордером научился работать,а если их становиться много, то уже проблемно.
Пришлось смотреть куски кода из других советников. В частности илана и автопрофита.
Не понимаю разницы void и double. Видел где-то что используется  void решил и здесь попробовать. Если вы подскажете для чего каждый создан, то начну разбираться) За это отдельное спасибо)

Заменил то что вы сказали, и начал советник закрывать сделки. Только тоже не всегда гладко.
Вначале закрыл. А потом перестал. И прибыль уже огроменная была. Заметил ошибку 138. Надо только понять как с ней борются.

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

Ну чтоб посчитать сколько пунктов это надо  Orderprofit разделить на Orderlots. Скорее всего так.

И ещё что-то неправильно профит считаю. Т.к. сделка открывается и закрывается сразу же.  С прибылью -3  с лотом 1. Открыло закрыло. Открыло закрыло. Что я не правильно в профите бай-ордеров считаю? Даже если в валюте депозита, то всё равно должно закрываться в каком-то плюсе, а не в минусе.

У меня есть огромное желание научиться. И пользуюсь чужим кодом только чтоб понять принцип работы. Чтоб было от чего оттолкнуться.

Цитата expforex ()
Двухсторонний мартин:http://www.mqlsoft.net/shop/179/desc/exp-dve-storony

А там закрытый код. Там тоже не смогу ничего научиться. А денег на покупку ещё не заработал)

Прикрепления: BUY_SELL_MARTIN.mq4(8Kb)
 
СообщениеСпасибо большое за помощь.
Действительно создаю сам советника.  Только вот с одним ордером научился работать,а если их становиться много, то уже проблемно.
Пришлось смотреть куски кода из других советников. В частности илана и автопрофита.
Не понимаю разницы void и double. Видел где-то что используется  void решил и здесь попробовать. Если вы подскажете для чего каждый создан, то начну разбираться) За это отдельное спасибо)

Заменил то что вы сказали, и начал советник закрывать сделки. Только тоже не всегда гладко.
Вначале закрыл. А потом перестал. И прибыль уже огроменная была. Заметил ошибку 138. Надо только понять как с ней борются.

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

Ну чтоб посчитать сколько пунктов это надо  Orderprofit разделить на Orderlots. Скорее всего так.

И ещё что-то неправильно профит считаю. Т.к. сделка открывается и закрывается сразу же.  С прибылью -3  с лотом 1. Открыло закрыло. Открыло закрыло. Что я не правильно в профите бай-ордеров считаю? Даже если в валюте депозита, то всё равно должно закрываться в каком-то плюсе, а не в минусе.

У меня есть огромное желание научиться. И пользуюсь чужим кодом только чтоб понять принцип работы. Чтоб было от чего оттолкнуться.

Цитата expforex ()
Двухсторонний мартин:http://www.mqlsoft.net/shop/179/desc/exp-dve-storony

А там закрытый код. Там тоже не смогу ничего научиться. А денег на покупку ещё не заработал)

Автор - Yurchik
Дата добавления - 16.12.2013 в 16:47

expforexДата: Понедельник, 16.12.2013, 21:00 | Сообщение # 5
Главный Администартор
Группа: Администраторы
Сообщений: 8959
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

Цитата Yurchik ()
Заметил ошибку 138. Надо только понять как с ней борются.

http://www.expforex.com/publ....-1-0-75

Цитата Yurchik ()
Не понимаю разницы void и double


double - Константы с плавающей точкой состоят из целой части, точки (.) и дробной части. Целая и дробная части представляют собой последовательности десятичных цифр.

void - Это исполнение функции без возврата результата. Т.е. просто исполнение
double - Это исполнение функции с возвратом результата в виде числа с плавающей точкой.

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

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

Цитата Yurchik ()
И ещё что-то неправильно профит считаю. Т.к. сделка открывается и закрывается сразу же.  С прибылью -3  с лотом 1. Открыло закрыло. Открыло закрыло. Что я не правильно в профите бай-ордеров считаю? Даже если в валюте депозита, то всё равно должно закрываться в каком-то плюсе, а не в минусе.

если сделка открылась у нее уже есть минус спред, поэтому при подсчете пунктов учтите это
чтобы получить пункты нужно не просто поделить профит на лот .
для получения пунктов прибыли для БАЙ например надо цену Бид - цену открытия позиции бай.

Цитата Yurchik ()
А там закрытый код. Там тоже не смогу ничего научиться. А денег на покупку ещё не заработал)

Это как пример,
у меня очень много открытых советников с уникальным набором функций. по 10 баксов .



Программирование на заказ || Наши Разработки

 
Сообщение
Цитата Yurchik ()
Заметил ошибку 138. Надо только понять как с ней борются.

http://www.expforex.com/publ....-1-0-75

Цитата Yurchik ()
Не понимаю разницы void и double


double - Константы с плавающей точкой состоят из целой части, точки (.) и дробной части. Целая и дробная части представляют собой последовательности десятичных цифр.

void - Это исполнение функции без возврата результата. Т.е. просто исполнение
double - Это исполнение функции с возвратом результата в виде числа с плавающей точкой.

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

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

Цитата Yurchik ()
И ещё что-то неправильно профит считаю. Т.к. сделка открывается и закрывается сразу же.  С прибылью -3  с лотом 1. Открыло закрыло. Открыло закрыло. Что я не правильно в профите бай-ордеров считаю? Даже если в валюте депозита, то всё равно должно закрываться в каком-то плюсе, а не в минусе.

если сделка открылась у нее уже есть минус спред, поэтому при подсчете пунктов учтите это
чтобы получить пункты нужно не просто поделить профит на лот .
для получения пунктов прибыли для БАЙ например надо цену Бид - цену открытия позиции бай.

Цитата Yurchik ()
А там закрытый код. Там тоже не смогу ничего научиться. А денег на покупку ещё не заработал)

Это как пример,
у меня очень много открытых советников с уникальным набором функций. по 10 баксов .

Автор - expforex
Дата добавления - 16.12.2013 в 21:00

YurchikДата: Понедельник, 16.12.2013, 23:55 | Сообщение # 6
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 5
Награды: 0
Статус: Offline


[Бонусы за сообщения ]

За ошибку в 138 спасибо. Было проскальзывание в параметрах 0, а поставил 10, и ошибка исчезла.

Цитата expforex ()
для получения пунктов прибыли для БАЙ например надо цену Бид - цену открытия позиции бай.
Ну это правильно.
А можно и так (Orderprofit разделить на Orderlots ) + Spread

Кстати, понял почему сделки открываются и закрываются сразу же. Всё из-за подсчёта прибыльности сделок.
Когда у меня было в функции void, то  сумма прибыли каждый раз обновлялась.
А когда вы сказали поставить double, то сумма перестала обновляться. Ну типо подсчёт. Профит 10. Потом опять подсчитываем профит и берём ту 10, и складываем текущий профит 11 к примеру получаем 21. А должны были забыть про ту 10, а взять 0 + 11=11. И получить что у сделки профит 11. Ну и так общий профит советник тянет
и сразу же закрывает ордера, думая что они с прибыльным профитом.
Как я понял надо поставить ProfitBUY=0; и ProfitSELL=0; каждый раз как мы подсчитали свой профит. Только где это надо ставить  не понимаю. Пробую везде впихнуть. Не получается. Или возможно как-то по-другому выйти из данной ситуации?
Можете направить на путь истинный?

 
СообщениеЗа ошибку в 138 спасибо. Было проскальзывание в параметрах 0, а поставил 10, и ошибка исчезла.
Цитата expforex ()
для получения пунктов прибыли для БАЙ например надо цену Бид - цену открытия позиции бай.
Ну это правильно.
А можно и так (Orderprofit разделить на Orderlots ) + Spread

Кстати, понял почему сделки открываются и закрываются сразу же. Всё из-за подсчёта прибыльности сделок.
Когда у меня было в функции void, то  сумма прибыли каждый раз обновлялась.
А когда вы сказали поставить double, то сумма перестала обновляться. Ну типо подсчёт. Профит 10. Потом опять подсчитываем профит и берём ту 10, и складываем текущий профит 11 к примеру получаем 21. А должны были забыть про ту 10, а взять 0 + 11=11. И получить что у сделки профит 11. Ну и так общий профит советник тянет
и сразу же закрывает ордера, думая что они с прибыльным профитом.
Как я понял надо поставить ProfitBUY=0; и ProfitSELL=0; каждый раз как мы подсчитали свой профит. Только где это надо ставить  не понимаю. Пробую везде впихнуть. Не получается. Или возможно как-то по-другому выйти из данной ситуации?
Можете направить на путь истинный?

Автор - Yurchik
Дата добавления - 16.12.2013 в 23:55

expforexДата: Вторник, 17.12.2013, 00:06 | Сообщение # 7
Главный Администартор
Группа: Администраторы
Сообщений: 8959
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

уберите в начале

int ProfitBUY = 0;
int ProfitSELL = 0;

и нужно добавить в функции подсчета профита
double ProfitBUY = 0;
double ProfitSELL = 0;



Программирование на заказ || Наши Разработки

 
Сообщениеуберите в начале

int ProfitBUY = 0;
int ProfitSELL = 0;

и нужно добавить в функции подсчета профита
double ProfitBUY = 0;
double ProfitSELL = 0;

Автор - expforex
Дата добавления - 17.12.2013 в 00:06

YurchikДата: Вторник, 17.12.2013, 15:52 | Сообщение # 8
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 5
Награды: 0
Статус: Offline


[Бонусы за сообщения ]

Спасибо большое, но я уже вчера когда вышел из интернета нашёл где обновлять надо.
Но с вашей подсказкой когда удалю код станет на 2 строчки короче)))

Спс. Если будут вопросы буду ещё обращаться)

 
СообщениеСпасибо большое, но я уже вчера когда вышел из интернета нашёл где обновлять надо.
Но с вашей подсказкой когда удалю код станет на 2 строчки короче)))

Спс. Если будут вопросы буду ещё обращаться)

Автор - Yurchik
Дата добавления - 17.12.2013 в 15:52

expforexДата: Вторник, 17.12.2013, 16:06 | Сообщение # 9
Главный Администартор
Группа: Администраторы
Сообщений: 8959
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

Yurchik, ок



Программирование на заказ || Наши Разработки

 
СообщениеYurchik, ок

Автор - expforex
Дата добавления - 17.12.2013 в 16:06

YurchikДата: Пятница, 07.02.2014, 15:19 | Сообщение # 10
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 5
Награды: 0
Статус: Offline


[Бонусы за сообщения ]

Здравствуйте. Опять столкнулся с проблемкой. Выручайте.
Суть такова. Необходимо закрыть две последние сделки если их профит депозита больше какого-то числа.
Вот например для бай-ордеров.

Так вроде считаю профит для двух последних ордеров. Т.е. из всей серии, а их может быть и 10 и больше, нужно чтобы профит последней(будет скорее всего положительный) и профит предпоследней (будет скорее всего отрицательный) в сумме были больше параметра.
double Profit_BUY (int Magic_BUY)
{
 int peremennaya1;
 ProfitBUY=0;
   for ( peremennaya1 = OrdersTotal(); peremennaya1 >= OrdersTotal()-2; peremennaya1--)
   {
      OrderSelect(peremennaya1, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_BUY)  
         if (OrderType() == OP_BUY)
         ProfitBUY += OrderProfit()+OrderSwap()-OrderCommission();  
         Print("Профит  BUY-orderов=",ProfitBUY);
         Sleep(1000);    
   }
   return (ProfitBUY);
}

И вот тут пытаюсь закрыть эти самые две последние сделки.
double CloseAllOrdersBUY(int slip, int Magic_BUY)
{
int peremennaya2;
   for (peremennaya2 = OrdersTotal(); peremennaya2 >= OrdersTotal()-2; peremennaya2--)
   {
      OrderSelect(peremennaya2, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol())
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_BUY)
         {
            if (OrderType() == OP_BUY)
            OrderClose(OrderTicket(), OrderLots(), Ask, slip, Blue);
         }
         Sleep(1000);
      }
   }
}

Понимаю что ошибка будет около OrdersTotal()-2, возможно надо OrdersTotal()-1. Но не так, не так не работает. Закрывает сразу все ордера. И прибыль последнего только больше заданного числа, а предпоследнего намного меньше, чтоб в сумме они дали больше определённого числа.

 
СообщениеЗдравствуйте. Опять столкнулся с проблемкой. Выручайте.
Суть такова. Необходимо закрыть две последние сделки если их профит депозита больше какого-то числа.
Вот например для бай-ордеров.

Так вроде считаю профит для двух последних ордеров. Т.е. из всей серии, а их может быть и 10 и больше, нужно чтобы профит последней(будет скорее всего положительный) и профит предпоследней (будет скорее всего отрицательный) в сумме были больше параметра.
double Profit_BUY (int Magic_BUY)
{
 int peremennaya1;
 ProfitBUY=0;
   for ( peremennaya1 = OrdersTotal(); peremennaya1 >= OrdersTotal()-2; peremennaya1--)
   {
      OrderSelect(peremennaya1, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_BUY)  
         if (OrderType() == OP_BUY)
         ProfitBUY += OrderProfit()+OrderSwap()-OrderCommission();  
         Print("Профит  BUY-orderов=",ProfitBUY);
         Sleep(1000);    
   }
   return (ProfitBUY);
}

И вот тут пытаюсь закрыть эти самые две последние сделки.
double CloseAllOrdersBUY(int slip, int Magic_BUY)
{
int peremennaya2;
   for (peremennaya2 = OrdersTotal(); peremennaya2 >= OrdersTotal()-2; peremennaya2--)
   {
      OrderSelect(peremennaya2, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol())
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_BUY)
         {
            if (OrderType() == OP_BUY)
            OrderClose(OrderTicket(), OrderLots(), Ask, slip, Blue);
         }
         Sleep(1000);
      }
   }
}

Понимаю что ошибка будет около OrdersTotal()-2, возможно надо OrdersTotal()-1. Но не так, не так не работает. Закрывает сразу все ордера. И прибыль последнего только больше заданного числа, а предпоследнего намного меньше, чтоб в сумме они дали больше определённого числа.

Автор - Yurchik
Дата добавления - 07.02.2014 в 15:19
Форум трейдеров » Скрипты Советники Индикаторы для Metatrader4/Metatrader5 » MT 4 MQL программирование, помощь. » Помогите с советником.
Страница 1 из 212»
Поиск:


WebMoney Яндекс цитирования.