[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 84

 
NameLess:


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

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

как то так вобщем)


Спасибо. Я уже на верном пути!))) Пришлось покопаться, но что хотел - реализовал (во всяком случае как-то работает :))) ).
 
NameLess:
А Вы знаете, как выставлять контроль числа ордеров? Согласен, вопрос, наверное, вызывает нескрываемую улыбку, местами переходящую в хохот.))) Но я только как неделю стал копаться в mt-шных кодах. Я ещё и слова не все знаю ))) Умные ))
 
nemo811:
А Вы знаете, как выставлять контроль числа ордеров? Согласен, вопрос, наверное, вызывает нескрываемую улыбку, местами переходящую в хохот.))) Но я только как неделю стал копаться в mt-шных кодах. Я ещё и слова не все знаю ))) Умные ))


я сам не могу назваться спецом))

не совсем понятен вопрос, что значит контроль числа? если при определённых условиях надо открыть какой то ордер 2 раза, то нужно создать это условие.

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

в данном случае проще будет привести пример, тогда смогу более конкретно сказать что и как сделать, если буду знать решение:)

 

пример на странице 83, задача от sergeev

Код заработал - спасибо Вам. Но когда опытные люди говорят такие слова - волей-неволей задумаешься: что не так?

)))

 
nemo811:

пример на странице 83, задача от sergeev

Код заработал - спасибо Вам. Но когда опытные люди говорят такие слова - волей-неволей задумаешься: что не так?

)))


если код делает что задумано-значит всё так)) видимо имелось в виду, что такой код может нон-стопом открывать ордера, но мы делали чтоб по разу всё открылось и отложилось. значит всё путём)
 
NameLess:

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

Добро. Ещё раз спасибо.
 
nemo811:

кстати. в начале ф-ии старт рекомендую вписать что то типа

if ( OrdersTotal()!=0)

{

BUY = false;

BUY_STOP = false;

BUY_LIMIT = false;

SELL = false;

SELL_STOP = false;

SELL_LIMIT = false;

}

это защита на случай наличия открытых позиций, вдруг придётся перезапустить клиент. иначе он повторно откроет всю пачку ордеров

также в целом совет: подумайте логически над каждой строчкой-что ей может помешать в работе. у меня в советнике может быть сбой тока если кирпич на комп упадёт.

 
nemo811:

Вот малость уже устаревшая версия того, над чем я чейчас работаю. Автор drknn разрешил её выкладывать.


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

Только из-за прав там не передеритесь :)

 
sergeev:
через индикатор https://docs.mql4.com/ru/indicators/iBandsOnArray
спасибо!
 
NameLess:

кстати. в начале ф-ии старт рекомендую вписать что то типа

if ( OrdersTotal()!=0)

{

BUY = false;

....

это защита на случай наличия открытых позиций, вдруг придётся перезапустить клиент. иначе он повторно откроет всю пачку ордеров

Спасибо - важное замечание. Решая эту задачку заодно разобрался с подсчётом ордеров - вставил счётчики (спасибо sergeev).

Теперь код выглядит так (при перезапуске терминала лишнее не открывает):

//--------------------------------------------------------------------
extern int     MAGIC       = 0;        //уникальный номер ордера
extern bool    BUY         = false;    //открыть ордер BUY
extern bool    BUY_STOP    = false;    //поставить ордер BUY STOP
extern bool    BUY_LIMIT   = false;    //поставить ордер BUY LIMIT
extern bool    SELL        = false;    //открыть ордер SELL
extern bool    SELL_STOP   = false;    //поставить ордер SELL STOP
extern bool    SELL_LIMIT  = false;    //поставить ордер SELL LIMIT
extern double  Lot         = 0.1;      //объем ордера
extern int     takeprofit  = 0;        //уровень выставления TP, если 0, то TP не выставляется
extern int     stoploss    = 0;        //уровень выставления SL, если 0, то SL не выставляется
extern int     DistanceSet = 40;       //расстояние от рынка для отложенника
extern int     Proskalz    = 3;        //максимально допустимое отклонение цены для рыночных ордеров
//--------------------------------------------------------------------
double SL,TP;
//--------------------------------------------------------------------
int start()
{
   if (BUY)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy");
      BUY=false;
   }
   if (SELL)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell");
      SELL=false;
   }
   if (BUY_STOP)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask + DistanceSet*Point - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy Stop");
      BUY_STOP=false;
   }
   if (SELL_STOP)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid - DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid - DistanceSet*Point + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell Stop");
      SELL_STOP=false;
   }
   if (BUY_LIMIT)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask - DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask - DistanceSet*Point - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy Limit");
      BUY_LIMIT=false; 
   }
   if (SELL_LIMIT)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid + DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid + DistanceSet*Point + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell Limit");
      SELL_LIMIT=false;
   }
return(0);
}
void OPENORDER(string ord)
{
   int SchBuy=SchBuy_b(MAGIC);
   int SchSell=SchSell_b(MAGIC);
   int SchBuyStop=SchBuyStop_b(MAGIC);
   int SchSellStop=SchSellStop_b(MAGIC);
   int SchBuyLimit=SchBuyLimit_b(MAGIC);
   int SchSellLimit=SchSellLimit_b(MAGIC);
   int ticket = -1;
   int err;
   while (ticket<0)
   {
      if (SchBuy<1) {if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSell<1) {if (ord=="Sell") ticket=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchBuyStop<1) {if (ord=="Buy Stop") ticket=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSellStop<1) {if (ord=="Sell Stop") ticket=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchBuyLimit<1) {if (ord=="Buy Limit") ticket=OrderSend(Symbol(),OP_BUYLIMIT, Lot,NormalizeDouble(Ask - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSellLimit<1) {if (ord=="Sell Limit") ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lot,NormalizeDouble(Bid + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}      
      if (ticket==-1) //неудачная попытка
      {  
         ShowERROR();
         err++;Sleep(2000);RefreshRates();
      }
      if (ticket || err >10) return;
   }
return;
}                                    
//--------------------------------------------------------------------
void ShowERROR()
{
   int err=GetLastError();
   switch ( err )
   {                  
      case 1:   return;
      case 2:   Alert("Нет связи с торговым сервером ",Symbol());return;
      case 3:   Alert("Error неправильные параметры ",Symbol());return;
      case 130: Alert("Error близкие стопы   Ticket ",Symbol());return;
      case 134: Alert("Недостаточно денег   ",Symbol());return;
      case 146: Alert("Error Подсистема торговли занята ",Symbol());return;
      case 129: Alert("Error Неправильная цена ",Symbol());return;
      case 131: Alert("Error Неправильный объем ",Symbol());return;
      case 4200:Alert("Error Объект уже существует ",Symbol());return;
      default:  Alert("Error  " ,err," ",Symbol());return;
   }
}

+ соответствующие счётчики.

Спасибо.

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