Ваши вопросы по языку MQL4

alexshell

Элитный участник
здравствуйте уважаемые програмисты. скажите пожалуста --мне на почту постоянно приходит отчот о моих зделках от ДЦ. Можно ли както от них скрыть свои сделки ??? Спасибо. Наверное наивный вопрос .

Можно. Не торговать у них. :)
Вы им шлете запрос на открытие сделки, они вам открывают её. По другому никак. Все это фиксируется.
 

sergey1234567890

Интересующийся
Можно. Не торговать у них. :)
Вы им шлете запрос на открытие сделки, они вам открывают её. По другому никак. Все это фиксируется.

спасибо. а есть ли доля правды в словах-----ЧТО ОНИ ЭТИМ КАКТО МОГУТ ВОСПОЛЬЗОВАТЬСЯ ??
 

alexshell

Элитный участник
спасибо. а есть ли доля правды в словах-----ЧТО ОНИ ЭТИМ КАКТО МОГУТ ВОСПОЛЬЗОВАТЬСЯ ??
У ДЦ есть возможности вмешиваться в торговлю. Будут ли они использовать эти возможности зависит от порядочности ДЦ. Но эта не та ветка для обсуждения этого. Здесь обсуждают вопросы по програмированию.
 

sergyius

Новичок форума
спасибо. а есть ли доля правды в словах-----ЧТО ОНИ ЭТИМ КАКТО МОГУТ ВОСПОЛЬЗОВАТЬСЯ ??
Объясню ваши слова (подтекст: ваших "тараканов") примером(-ами).

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

forextime

Активный участник
Не могу обратно присвоить false.
---------------------------------------
bool TimeTrade=false;
int TradeStart = 1;
int TradeEnd = 12;

void start() {
for(i=0;i<OrdersHistoryTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
LastProfit=OrderProfit()+OrderSwap()+OrderCommission();
}
Есть условие:
if (LastProfit>=0) {TimeTrade=true;} else TimeTrade=false;

Т.е. последняя серия ордеров закрыта с профитом и активируется ограничение торговли по времени, если последняя серия ордеров закрыта с лоссом, то false не присваивается, всегда true теперь. Как то обнулять надо??
 
Последнее редактирование:

_SERG_

Активный участник
У ДЦ есть возможности вмешиваться в торговлю. Будут ли они использовать эти возможности зависит от порядочности ДЦ. Но эта не та ветка для обсуждения этого. Здесь обсуждают вопросы по програмированию.
ПРАЛЬНО! И послать по ссылке.
Объясню ваши слова (подтекст: ваших "тараканов") примером(-ами).

"Если вы боитесь, что кто-то воспользуется невинностью вашей дочери - не рожайте дочь.
Если вы боитесь, что кто-то сожжет Ваш дом - никогда не имейте дома.
Если вы боитесь умереть - не живите."
А шо, на счёт семинарии?:crazy:
Просвятишь, отмолишь?:please:
Братэлла, ты в тему, а не по ушам.:laugh:
 
Последнее редактирование:

_SERG_

Активный участник
Не могу обратно присвоить false.
---------------------------------------
bool TimeTrade=false;
int TradeStart = 1;
int TradeEnd = 12;

void start() {
for(i=0;i<OrdersHistoryTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
LastProfit=OrderProfit()+OrderSwap()+OrderCommission();
}
Есть условие:
if (LastProfit>=0) {TimeTrade=true;} else TimeTrade=false;

Т.е. последняя серия ордеров закрыта с профитом и активируется ограничение торговли по времени, если последняя серия ордеров закрыта с лоссом, то false не присваивается, всегда true теперь. Как то обнулять надо??

Ты не путай, то о чём ты думаешь, с тем, что на самом деле происходит.
Перепроверь, состоялось, то, что хотел, или нет? Дальше по результатам.

Эт про условие!!!!
 
Последнее редактирование:

forextime

Активный участник
Какое время у закрытого ордера ??
Есть ограничение работы советника по времени


bool TimeTrade = true;
int TradeStart = 1;
int TradeEnd = 17;

datetime LastCL_time;

void start() {

double LastProfit = 0;
for(i=0;i<OrdersHistoryTotal();i++) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==OrderSymbol()&& OrderMagicNumber()==Magic) {
LastCL_time=OrderCloseTime();
LastProfit=OrderProfit()+OrderSwap()+OrderCommission();
}

Надо после закрытия ордера с профитом поменять значение TradeEnd = время закрытия ордера;
например:


if(LastProfit>0) {TradeEnd=время закрытия ордера;}

Такое условие не подходит if(LastProfit>0) {TradeEnd=(int)LastCL_time;}
 

_SERG_

Активный участник
1. Какое время у закрытого ордера ??
2. Есть ограничение работы советника по времени

Код:
bool  TimeTrade = true;
int     TradeStart = 1;
int     TradeEnd  = 17;

datetime LastCL_time; 

void start() { 

double LastProfit  = 0;
for(i=0; i<OrdersHistoryTotal(); i++) {
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && 
      OrderSymbol()==OrderSymbol()  && 
      OrderMagicNumber()==Magic) {
      LastCL_time=OrderCloseTime();
      LastProfit=OrderProfit()+OrderSwap()+OrderCommission();
      [B][COLOR=Red]НУ, ТАК И ПОМЕНЯЙ ЕЁ ЗДЕСЬ, В УСЛОВИИ!!!
     3.  [/COLOR][/B][B]TradeEnd = ....[/B] ;   
[COLOR=Red]      ТОК НЕ ЗАБУДЬ ПРО ОБЛАСТЬ ВИДИМОСТИ ЗНАЧЕНИЯ И ТИП ДАННЫХ.[/COLOR]
   } 
}


4. Надо после закрытия ордера с профитом поменять значение TradeEnd = время закрытия ордера;
например:

Код:
if(LastProfit>0) {TradeEnd=время закрытия ордера;}
5.Такое условие не подходит
Код:
if(LastProfit>0) {TradeEnd=(int)LastCL_time;}

1. OrderCloseTime() , тип - datetime
2.
ЭТ КАК ТЫ ПОНИМАЕШЬ? ЧТО В ЭТОТ ПЕРИОД ДОЛЖЕН ДЕЛАТЬ, ИЛИ НЕ ДЕЛАТЬ КОД?
3. КРАСНЕНЬКИМ ....
4. В твоей логике не на "время"- YYYY-MM-DD H24:MI:SS , а на "ЧАС" - Hour() , когда закрылся ордер, ты уж разберись, чЁ куда толкаешь.
5. Ессссессна не подойдёт, начало кода посмотри, чё ты там навоял.


 
Последнее редактирование:

forextime

Активный участник
1. OrderCloseTime() , тип - datetime
2.
ЭТ КАК ТЫ ПОНИМАЕШЬ? ЧТО В ЭТОТ ПЕРИОД ДОЛЖЕН ДЕЛАТЬ, ИЛИ НЕ ДЕЛАТЬ КОД?
3. КРАСНЕНЬКИМ ....
4. В твоей логике не на время, а на "ЧАС", когда закрылся ордер, ты уж разберись, чЁ куда толкаешь.
5. Ессссессна не подойдёт, начало кода посмотри, чё ты там навоял.

Уже разобрался, спасибо за помощь))
Преобразование добавить после старта:
PHP:
//+----------------------------------------------------------+ 
//| Преобразование типа datetime в строку формата HH.MM.SS   | 
//+----------------------------------------------------------+ 
string HourToStr(datetime ht) { 
  string hh="", mm="", ss=""; 
  if (TimeHour(ht)<10) hh="0"+(string)TimeHour(ht); 
  else hh=(string)TimeHour(ht); 
  if (TimeMinute(ht)<10) mm="0"+(string)TimeMinute(ht); else mm=(string)TimeMinute(ht); 
  if (TimeSeconds(ht)<10) ss="0"+(string)TimeSeconds(ht); 
  else ss=(string)TimeSeconds(ht);   
  return(hh+":"+mm+":"+ss); 
}
Далее нужное условие теперь выглядит так:

PHP:
if(LastProfit>0) {TradeEnd=HourToStr(LastCL_time);}
И во входных параметрах поменять с int на string

PHP:
string  TradeEnd = "15:00";
 

alex_almaty

Интересующийся
Добрый день подскажите как сделать чтобы советник используя 15 минутный тайм фрейм проверял значения каждые 20 минут допустим в 9-20, 9-40 следил за пересечением RSI и в случае пересечения уровня через двадцать минут проверял изменение цены. Вот то что мне нужно исправить:

PHP:
if (Hour()==9 && (Minute() == 20) && (RSI>70))
Price2==Bid;
     {
      if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
  
         {
          ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
          return(0);
         }
    
     }
 

seronn

Новичок форума
Добрый день, уважаемые программисты)))
Обнаружил неприятный баг: Имеется код мартина в советнике:

double lot=Lots;

if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderProfit()<0)
{
lot=OrderLots()*KLot;
}
}
}
Суть - при закрытии позиции в минус следующая открывается с коэффициентом от предыдущей. Обнаружил неприятный баг: если после закрытия в минус была ручная сделка или балансовая операция с любым результатом(+ -) советник сбраывает лот на начальный... (
Оно и понятно, последний ордер в магиком 0, и не удовлетворяет условию, получается, соответственно лот обнуляется. Как это можно победить?
 
Последнее редактирование:

Ugar

Гуру форума
Добрый день, уважаемые программисты)))
Обнаружил неприятный баг: Имеется код мартина в советнике:
Суть - при закрытии позиции в минус следующая открывается с коэффициентом от предыдущей. Обнаружил неприятный баг: если после закрытия в минус была ручная сделка или балансовая операция с любым результатом(+ -) советник сбраывает лот на начальный... (
Оно и понятно, последний ордер в магиком 0, и не удовлетворяет условию, получается, соответственно лот обнуляется. Как это можно победить?
Надо искать среди всех исторических именно свойЮ а не тупо выбрать последний в списке.
Как то так:
double lot=Lots;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderProfit()<0) lot=OrderLots()*KLot;
break;
}
}
}
 

seronn

Новичок форума
Ugar, спасибо за ответ! Код применил, работу на практике проверю позднее ) Можно попросить объяснить break;? Почему выход из цикла именно в этом месте?
 

Ugar

Гуру форума
Ugar, спасибо за ответ! Код применил, работу на практике проверю позднее ) Можно попросить объяснить break;? Почему выход из цикла именно в этом месте?
Цикл перебирает ордера, пока не найдёт свой по маджику и символу.
Выполняет проверку прибыли и прерывает цикл. Ведь нужный ордер уже найден и остальные не интересуют.
 

mobidik

-----
Цикл перебирает ордера, пока не найдёт свой по маджику и символу.
Выполняет проверку прибыли и прерывает цикл. Ведь нужный ордер уже найден и остальные не интересуют.

Вопрос начинался с
Добрый день, уважаемые программисты)))
Обнаружил неприятный баг: Имеется код мартина в советнике:...
а для него, мартина, нужен результат по последнему закрытому ордеру, следовательно, нужно добавить проверку по времени, т.е. выбрать последний ордер по символу + меджик.
 

Ugar

Гуру форума
Вопрос начинался с

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

seronn

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

Именно так, нужно найти результат последнего закрытого ордера. Как нужно это реализовать?
Сейчас закрывается серия функцией, при положительном результате серии сначала убыточные, затем прибыльные. Для отрицательного результата серии аналогичная функция наоборот.
Примерно так?(прошу проверить):
double lot=Lots;
datetime t = 0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderCloseTime() > t)
{
if(OrderProfit()<0) lot=OrderLots()*KLot;
t = OrderCloseTime();
break;
}
}
}
}
 
Последнее редактирование:
  • Like
Реакции: Ugar

Ugar

Гуру форума
Именно так, нужно найти результат последнего закрытого ордера. Как нужно это реализовать?
Сейчас закрывается серия функцией, при положительном результате серии сначала убыточные, затем прибыльные. Для отрицательного результата серии аналогичная функция наоборот.
Добавил поиск последнего ордера по времени закрытия. Убрал break.
double lot=Lots;
datetime LastCloseTime=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderCloseTime()>LastCloseTime)
{
LastCloseTime=OrderCloseTime();
if(OrderProfit()<0) lot=OrderLots()*KLot;
else lot=Lots;
}
}
}
}
 
Верх