Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 370

 
Ekburg, ок
 
Ekburg:


Установите последний билд в терминал, в нём писать код проще, меньше вероятность ошибок, советую!:)

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


это у меня выход из советника, если выполняются все условия то происходит выход из советника

т.е.

fail=true;

и далее

if(fail) return(0);

 
SpikeOne:


это у меня выход из советника, если выполняются все условия то происходит выход из советника

т.е.

fail=true;

и далее

if(fail) return(0);


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

То, что я прислал помогло?!

 
if ( AccountProfit()+ AccountBalance()>=740)
{
for(int zx=OrdersTotal(); zx+1>=0; zx--)
{
if(OrderSelect(zx,SELECT_BY_POS,MODE_TRADES)==true)
OrderDelete(OrderTicket());
}
while (OrdersTotal()>0)
{
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
OrderDelete(OrderTicket());
if(result!=TRUE)
{
er=GetLastError();
Print("LastError = ",er, " ",Symbol());
}
else er=0;
}
}
fail=true;
}

if(fail) return(0);

Если вставить мой код в советника https://www.mql5.com/ru/code перед местом

if(or_bu==risk && tick_b==0) open(0);

if(or_sl==risk && tick_s==0) open(1);

то советник начинает торговать по другому, хотя в мой код он должен заходить только набрав 740, изначально мой баланс 700 в тестере.

значения можно для тестов выставить вот такие:

extern bool test=false; // откл объектов при тесте

extern int prof=2; // уровень профита

extern int chag=1.7; // шаг между ордерами

extern int risk=0; //уровень риска

extern double lot = 0.01; // начальный лот

extern double k_lot=2; // увеличение объема

extern double lot_max=100;

bool result;

bool fail=false;

Вот в чем проблема того что он торгует по другому я понять не могу дату беру для теста 2013. 11. 08. и 2013. 11 .09.

 
SpikeOne:

то советник начинает торговать по другому, хотя в мой код он должен заходить только набрав 740, изначально мой баланс 700 в тестере.


if ( AccountProfit()+ AccountBalance()>=740)
   {
   for(int zx=OrdersTotal(); zx+1>=0; zx--)
      {
      if(OrderSelect(zx,SELECT_BY_POS,MODE_TRADES)==true)
      OrderDelete(OrderTicket());
      }
   while (OrdersTotal()>0)
      {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
         {
         if(OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
         if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
         if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
         OrderDelete(OrderTicket());
         if(result!=TRUE)
            {
            er=GetLastError();
            Print("LastError = ",er, " ",Symbol());
            }
         else er=0;
         }
      else Print( "Error when order select ", GetLastError());
      }
   if(OrdersTotal()==0) fail=true;
   }
if(fail=true) return(0);

Попробуйте мой код скомпилировать, результат сообщите, дальше подумаем...

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

 
Ekburg:

Попробуйте мой код скомпилировать, результат сообщите, дальше подумаем...

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


да скомпилировал, но проблема осталась.... да такое ощущение что он в код раньше заходит, хотя не должен.
 
SpikeOne:

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

AccountProfitВозвращает значение прибыли для текущего счета в базовой валюте.

В этом проблема я думаю, Вы хотите знать прибыль в баксах, а он выдаёт в евро, например

Попробуйте заменить весь расчёт первого оператора кода на это:

AccountEquityВозвращает сумму собственных средств для текущего счета. Расчет equity зависит от настроек торгового сервера.

и в итоге скомпилировать этот оператор:

if(AccountEquity()>=740)
   {
   ...
   }
 
Ekburg:

AccountProfitВозвращает значение прибыли для текущего счета в базовой валюте.

В этом проблема я думаю, Вы хотите знать прибыль в баксах, а он выдаёт в евро, например

Попробуйте заменить весь расчёт первого оператора кода на это:

AccountEquityВозвращает сумму собственных средств для текущего счета. Расчет equity зависит от настроек торгового сервера.

и в итоге скомпилировать этот оператор:


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

Даже если создать нового советника и вставить туда рабочий код то почему то он работает криво.

 
SpikeOne:


..если я вставляю в советника который работает НЕправильно, код который работает правильно, то после компиляций советник работает не верно...


тут тогда я не помощник) нужно весь советник перебирать.
 
Ekburg:

тут тогда я не помощник) нужно весь советник перебирать.


Я похоже нашёл косяк=) в начальных данных где шаг между ордерами указано значение int а я ставил 1.7, поменял на double заработало нормально=)