Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2361

 
ts22 #:
Спасибо, сейчас капну в глобальные переменные отвечающие за время. Я просто новичок, можете подсказать ресурсы где можно с примерами посмотреть как это делается? Я обычно беру советники с открытым кодом и читая код учусь, но не натыкался на советник с подобной функцией. Очень боюсь нахренавертить лишнего)

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

и сделать отдельный советник/сервис следящий за временем и меняющий эту переменную. Да хоть две кнопки разрешить/запретить. Или в рукопашную через меню "глобальные переменные" терминала

в результате: правки в торговый советник не вносятся и отдельным(по необходимости пополняемым) расписанием/распорядком можно управлять сразу несколькими советниками.

 
Maxim Kuznetsov #:

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

и сделать отдельный советник/сервис следящий за временем и меняющий эту переменную. Да хоть две кнопки разрешить/запретить. Или в рукопашную через меню "глобальные переменные" терминала

в результате: правки в торговый советник не вносятся и отдельным(по необходимости пополняемым) расписанием/распорядком можно управлять сразу несколькими советниками.

Вот да, я что-то подобное и пытаюсь сделать. Просто я всегда торговал в полуавтомате, один советник всегда висит на графике и следит за открытыми сделками. К нему вопросов нет. Теперь собрал советника который открывает сделки как только я его кидаю на график, и хотел бы именно в нём задать несколько условий при которых он пропускает заранее выбранное кол-во баров по настраиваемому таймфрейму. Поэтому и прошу у кого-нибудь глянуть на кусок подобного кода.
 
ts22 #:
как только я его кидаю на график, и хотел бы именно в нём задать несколько условий при которых он пропускает заранее выбранное кол-во баров по настраиваемому таймфрейму

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

отсчитывать время от непосредственного старта умеет скрипт. Это его свойство by-design - в начале время запомнил и всё хорошо...

советник-же рестартует заново при смене таймфрейма, рестарте терминала, и прочих неожиданностях (редактировании параметров, смене счёта, IP-адреса, экспирации ключей и так далее)

то есть если делать хорошо как для себя, то при запуске надо создавать "якорёк" (глобальную переменную или на край файл) и от него отсчитывать время/бары. Потом незабыть удалить.

 
Здравствуйте. Подскажите пожалуйста как сделать так чтобы советник сам определял самый убыточный открытый ордер. 
 
Maxim Kuznetsov #:

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

Вы всё правильно поняли. В этом и вся суть, что казалось бы всё просто) Я понимаю всё про добротность, надёжность и пр. но реализовать программно в такое пока не лезу, беру эту функцию на себя. Поэтому у меня сейчас достаточно простая задача. К примеру: последний ордер открытый советником убыточный и он это понял и не торгует 5 минут, 5 минут прошло и опять торгует, и всё))
 
ts22 #:
Вы всё правильно поняли. В этом и вся суть, что казалось бы всё просто) Я понимаю всё про добротность, надёжность и пр. но реализовать программно в такое пока не лезу, беру эту функцию на себя. Поэтому у меня сейчас достаточно простая задача. К примеру: последний ордер открытый советником убыточный и он это понял и не торгует 5 минут, 5 минут прошло и опять торгует, и всё))


void OnTick()
  {
 //---
   if(TimeCurrent()<LastProfit()) return;
   
   ......Здесь Ваш код

  }
//+------------------------------------------------------------------+
//| Проверка профита последнего закрытого ордера                     |
//+------------------------------------------------------------------+
datetime LastProfit()
  {
   double _prf=0;
   datetime _t=0,res=0;
   for(int pos=OrdersHistoryTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY)==true)
        {
         if(OrderSymbol()==_Symbol&&OrderMagicNumber()==Magic)
           {
            if(OrderCloseTime()>_t) {_t=OrderCloseTime(); _prf=OrderProfit()+OrderSwap()+OrderCommission();}
           }
        }
     }
   if(_prf<0) res=_t+5*60; // Добавляем 5 минут к закрытию ордера
   return(res);
  }
 

Всем добрый день. Подскажите пожалуйста такое дело. Мне надо определить условие что в моём терминале наступило в окне обзор рынка 18:00 и если это условие истинно то я выполню нужные мне действия. Как написать такое условие?

 
Tretyakov Rostyslav #:


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

 
DanilaMactep #:

Всем добрый день. Подскажите пожалуйста такое дело. Мне надо определить условие что в моём терминале наступило в окне обзор рынка 18:00 и если это условие истинно то я выполню нужные мне действия. Как написать такое условие?

         if(TimeCurrent()>=StrToTime("18:00")) Время пришло;
 

Приветствую всех! Кто-нибудь может корректировки в код новостного индикатора внести...

//+------------------------------------------------------------------+
#property description "Новостной индикатор."
#property description "Новости берет с сайта http://ru.investing.com/economic-calendar/"
#property description "На истории не работает. Показывает только текущую неделю."
#property strict

#property indicator_chart_window
#property indicator_buffers 1

extern int   MinDo          = 30;         // Срабатывание минут до новости     
extern int   MinPosle       = 30;         // Срабатывание минут после новости
extern int   offset         = 3;          // Часовой пояс сервера
extern bool  Vhigh          = true;       // Показывать важные новости
extern bool  Vmedium        = true;       // Показывать средние новости
extern bool  Vlow           = true;       // Показывать слабые новости 
extern string NewsSymb      = "USD,EUR,GBP,CHF,CAD,AUD,NZD,JPY"; //Валюты для показа в новостях (пусто - только текущие валюты) 
extern bool  RisovatLini    = true;       // Рисовать линии на графике
extern bool  Next           = false;      // Рисовать только линии будущих новостей  
extern bool  Signal         = false;      // Сигналить о предстоящей новости
extern color highc          = clrRed;     // Цвет важных новостей
extern color mediumc        = clrBlue;    // Цвет средних новостей
extern color lowc           = clrLime;    // Цвет слабых новостей 
extern int   Style          = 2;          // Стиль линии  
extern int   Upd            = 86400;      // Период обновления новостей в секундах

//--------------------------------------------------------------------
#import "wininet.dll"
int InternetAttemptConnect(int x);
int InternetOpenW(string sAgent,int lAccessType,
                  string sProxyName="",string sProxyBypass="",
                  int lFlags=0);
int InternetOpenUrlW(int hInternetSession,string sUrl,
                     string sHeaders="",int lHeadersLength=0,
                     int lFlags=0,int lContext=0);
int InternetReadFile(int hFile,int &sBuffer[],int lNumBytesToRead,
                     int &lNumberOfBytesRead[]);
int InternetCloseHandle(int hInet);
#import
//---------------------------------------------------------------------
double Torg[1];
int NomNews = 0;
string NewsArr[4][1000];

int Now=0;
color Col;
datetime LastUpd;
string str1;
//////////////////////////////////////////////////////////////////////////////////
int init()
  {
   IndicatorBuffers(1);
   SetIndexBuffer(0,Torg);
   if(StringLen(NewsSymb)>1)str1=NewsSymb;
     else str1=Symbol();
   return(0);
  }
//////////////////////////////////////////////////////////////////////////////////
int deinit()
  {
   if(UninitializeReason() == REASON_REMOVE)ObjectsDeleteAll(0,OBJ_VLINE);
   if(UninitializeReason() == REASON_PARAMETERS)
      {
       for(int i=0;i<ObjectsTotal();i++)
         {
          string name = ObjectName(i);
          if(ObjectGet(name,OBJPROP_TYPE) == OBJ_VLINE && ObjectGet(name,OBJPROP_TIME) >= iTime(Symbol(),PERIOD_W1,0)){ObjectDelete(name);i--;}
         }
      }
   return(0);
  }
//////////////////////////////////////////////////////////////////////////////////
int start()
  {
   if(TimeCurrent()-LastUpd>=Upd){Comment("Загрузка новостей...");Print("Загрузка новостей...");UpdateNews();LastUpd=TimeCurrent();Comment("");}
   WindowRedraw();
//---Рисуем линии новостей на графике--------------------------------------------
   if(RisovatLini)
     {
      for(int i=0;i<NomNews;i++)
        {
         //Print(NewsArr[3][i]);
         string Name = StringSubstr(TimeToStr(TimeNewsFunck(i),TIME_MINUTES)+"_"+NewsArr[1][i]+"_"+NewsArr[3][i],0,63);
         if(NewsArr[3][i]!="")if(ObjectFind(Name)==0)continue;
         if(StringFind(str1,NewsArr[1][i])<0)continue;
         if(TimeNewsFunck(i)<TimeCurrent() && Next)continue;
        
         color clrf = clrNONE;
         if(Vhigh &&   StringFind(NewsArr[2][i],"High")>=0    )clrf = highc;
         if(Vmedium && StringFind(NewsArr[2][i],"Moderate")>=0)clrf = mediumc;
         if(Vlow &&    StringFind(NewsArr[2][i],"Low")>=0     )clrf = lowc;
         
         if(clrf == clrNONE)continue;

         if(NewsArr[3][i]!="")
           {
            ObjectCreate(Name,0,OBJ_VLINE,TimeNewsFunck(i),0);
            ObjectSet(Name,OBJPROP_COLOR,clrf);
            ObjectSet(Name,OBJPROP_STYLE,Style);
           }
        }
     }
//---------------Обработка событий------------------------------------
   int i;
   Torg[0]=0;
   for(i=0;i<NomNews;i++)
     {
      int power = 0;
      if(Vhigh &&   StringFind(NewsArr[2][i],"High")>=0     )power = 1;
      if(Vmedium && StringFind(NewsArr[2][i],"Moderate")>= 0)power = 2;
      if(Vlow &&    StringFind(NewsArr[2][i],"Low")>= 0     )power = 3;
      if(power == 0)continue;
      if(TimeCurrent()+MinDo*60>TimeNewsFunck(i) && TimeCurrent()-MinPosle*60<TimeNewsFunck(i) && StringFind(str1,NewsArr[1][i])>=0)
        {
         Torg[0]=1;
         break;
        }
      else Torg[0]=0;

     }
   if(Torg[0]==1 && i!=Now && Signal) {Alert("Через ",(int)(TimeNewsFunck(i)-TimeCurrent())/60," минут выйдет новость ",NewsArr[1][i],"_",NewsArr[3][i]);Now=i;}

//-------------------------------------------------------------------------------
   return(0);
  }
///////////////////////////////////////////////////////////////////////
datetime TimeNewsFunck(int nomf)
   {
    string s = NewsArr[0][nomf];
    string time = StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4));
    return((datetime)(StringToTime(time) + offset*3600));
   }

//////////////////////////////////////////////////////////////////////////////////
void UpdateNews()
  {
   string TEXT = ReadCBOE();
   int sh = StringFind(TEXT,"pageStartAt>")+12;
   int sh2= StringFind(TEXT,"</tbody>");
   TEXT = StringSubstr(TEXT,sh,sh2-sh);
   
   sh = 0;
   while(!IsStopped())
     {
      sh = StringFind(TEXT,"event_timestamp",sh)+17;
      sh2= StringFind(TEXT,"onclick",sh)-2;
      if(sh<17 || sh2<0)break;
      NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh);
      
      sh = StringFind(TEXT,"flagCur",sh)+10;
      sh2= sh+3;
      if(sh<10 || sh2<3)break;
      NewsArr[1][NomNews]=StringSubstr(TEXT,sh,sh2-sh);
      if(StringFind(str1,NewsArr[1][NomNews])<0)continue;
      
      sh = StringFind(TEXT,"title",sh)+7;
      sh2= StringFind(TEXT,"Volatility",sh)-1;
      if(sh<7 || sh2<0)break;
      NewsArr[2][NomNews]=StringSubstr(TEXT,sh,sh2-sh);
      if(StringFind(NewsArr[2][NomNews],"High")>=0 && !Vhigh)continue;
      if(StringFind(NewsArr[2][NomNews],"Moderate")>=0 && !Vmedium)continue;
      if(StringFind(NewsArr[2][NomNews],"Low")>=0 && !Vlow)continue;
      
      sh = StringFind(TEXT,"left event",sh)+12;
      int sh1= StringFind(TEXT,"Speaks",sh);
      sh2= StringFind(TEXT,"<",sh);
      if(sh<12 || sh2<0)break;
      if(sh1<0 || sh1>sh2)NewsArr[3][NomNews]=StringSubstr(TEXT,sh,sh2-sh);
         else NewsArr[3][NomNews]=StringSubstr(TEXT,sh,sh1-sh);
      
      //Print(NomNews,"  ",NewsArr[0][NomNews],"  ",NewsArr[1][NomNews],"  ",NewsArr[2][NomNews],"  ",sh,"  ",sh1,"  ",sh2,"  ",NewsArr[3][NomNews]);
      NomNews ++ ;
      if(NomNews==300)break;
     }
  }
//////////////////////////////////////////////////////////////////////////////////
// Скачивает исходный код страницы CBOE  в текстовую переменную 
//                и возвращает как результат
//////////////////////////////////////////////////////////////////////////////////
string ReadCBOE()
{
   if(!IsDllsAllowed())
     {
       Alert("Необходимо в настройках разрешить использование DLL");
       return("");
     }
   int rv = InternetAttemptConnect(0);
   if(rv != 0)
     {
       Alert("Ошибка при вызове InternetAttemptConnect()");
       return("");
     }
   int hInternetSession = InternetOpenW("Microsoft Internet Explorer", 
                                        0, "", "", 0);
   if(hInternetSession <= 0)
     {
       Alert("Ошибка при вызове InternetOpenA()");
       return("");         
     }
   int hURL = InternetOpenUrlW(hInternetSession, 
              "http://ec.forexprostools.com?columns=exc_currency,exc_importance&category=_employment,_economicActivity,_inflation,_credit,_centralBanks,_confidenceIndex,_balance,_Bonds&importance=1,2,3&countries=25,6,37,72,22,17,39,10,35,43,60,36,110,26,12,4,5&calType=week&timeZone=15&lang=1", "", 0, 0, 0);
   if(hURL <= 0)
     {
       Alert("Ошибка при вызове InternetOpenUrlA()");
       InternetCloseHandle(hInternetSession);
       return("");         
     }      
   int cBuffer[256];
   int dwBytesRead[1]; 
   string TXT = "";
   while(!IsStopped())
     {
       bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);
       if(dwBytesRead[0] == 0)
           break;
       string text = "";   
       string text0= "";   
       for(int i = 0; i < 256; i++)
         {
              text0= CharToStr((char)(cBuffer[i] & 0x000000FF));
              if (text0!="\r") text = text + text0;
              else dwBytesRead[0]--;
              if(StringLen(text) == dwBytesRead[0]) break;
              
              text0= CharToStr((char)(cBuffer[i] >> (8 & 0x000000FF)));
              if (text0!="\r") text = text + text0;
              else dwBytesRead[0]--;
              if(StringLen(text) == dwBytesRead[0]) break;
              
              text0= CharToStr((char)(cBuffer[i] >> (16 & 0x000000FF)));
              if (text0!="\r") text = text + text0;
              else dwBytesRead[0]--;
              if(StringLen(text) == dwBytesRead[0]) break;

              text0= CharToStr((char)(cBuffer[i] >> (24 & 0x000000FF)));
              if (text0!="\r") text = text + text0;
              else dwBytesRead[0]--;
              if(StringLen(text) == dwBytesRead[0]) break;
              
         }
       TXT = TXT + text;
       Sleep(1);
     }
   InternetCloseHandle(hInternetSession);
   return(TXT);
} 
////////////////////////////////////////////////////////////////////////////////////

Сейчас так (001)

А нужно вот так (002)

Я так понимаю нужно OBJ_EVENT добавить, но знаний в этом вопросе недостаточно. Заранее благодарен!

Файлы:
001.png  25 kb
002.png  20 kb
Причина обращения: