//+---------------------------------------------------------------------------------+
void UpdateNews()
{
string TEXT=Read_HTML();
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(symb,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 && !NewsHard)
continue;
if(StringFind(NewsArr[2][NomNews],"Moderate")>=0 && !NewsMedium)
continue;
if(StringFind(NewsArr[2][NomNews],"Low")>=0 && !NewsLight)
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);
NomNews++;
if(NomNews==300)
break;
}
}
//+---------------------------------------------------------------------------------+
void LinesDraw()
{
for(int i=0; i<NomNews; 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(symb,NewsArr[1][i])<0)
continue;
if(TimeNewsFunck(i)<TimeCurrent() && Next)
continue;
color clrf = clrNONE;
if(NewsHard && StringFind(NewsArr[2][i],"High")>=0)
clrf=highc;
if(NewsMedium && StringFind(NewsArr[2][i],"Medium")>=0)
clrf=mediumc;
if(NewsLight && 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);
ObjectSetInteger(0,Name,OBJPROP_BACK,true);
}
}
//------------------------------------------- Обработка событий--------------------------------------- -----------//
int i;
CheckNews=0;
for(i=0; i<NomNews; i++)
{
int power=0;
if(NewsHard && StringFind(NewsArr[2][i],"High")>=0)
power=1;
if(NewsMedium && StringFind(NewsArr[2][i],"Medium")>=0)
power=2;
if(NewsLight && StringFind(NewsArr[2][i],"Low")>=0)
power=3;
if(power==0)
continue;
if(StringFind(symb,NewsArr[1][i])>=0)
{
CheckNews=1;
break;
}
else
CheckNews=0;
}
if(CheckNews==1 && i!=Now && Signal)
{
Alert("In ",(int)(TimeNewsFunck(i)-TimeCurrent())/60," minutes released news ",NewsArr[1][i],"_",NewsArr[3][i]);
Now=i;
}
if(flagAlert == true)
Alert(" ChNw = ",ChNw," CheckNews= ",CheckNews," sumNew= ",sumNew) ;
}
//+---------------------------------------------------------------------------------+
int AutoGMToffset()
{
int Timezone[43];
if (Auto_GMToffset == FALSE)
{
GMToffset = Manual_GMToffset;
LoclTime = TimeCurrent() - 3600 * GMToffset;
}
else
{
int offset1 = -420;
int offset2 = GetTimeZoneInformation(Timezone);
if (offset2 != 0) offset1 = Timezone[0];
if (offset2 == 2) offset1 += Timezone[42];
LoclTime = TimeLocal() + 60 * offset1;
GMToffset = (TimeCurrent() - LoclTime) / 3500;
}
return (0);
}
//+---------------------------------------------------------------------------------+
int Tradetime(int StartTime, int StopTime)
{
bool Tradetime = FALSE;
if (StartTime > StopTime) if (TimeHour(LoclTime) <= StopTime || TimeHour(LoclTime) >= StartTime) Tradetime = TRUE;
if (StartTime < StopTime) if (TimeHour(LoclTime) >= StartTime && TimeHour(LoclTime) <= StopTime) Tradetime = TRUE;
if (StartTime == StopTime)if (TimeHour(LoclTime) == StartTime) Tradetime = TRUE;
if (DayOfWeek() == 5 && TimeHour(LoclTime) > 6) Tradetime = FALSE;
if (TimeMinute(LoclTime) < RandomOpenMinuteDelay) Tradetime = FALSE;
if (DayOfWeek() == 1 && TimeHour(LoclTime) < 2) Tradetime = FALSE;
if (DayOfYear() < 7) Tradetime = FALSE;
if (Month() == 12 && Day() > 20) Tradetime = FALSE;
return (Tradetime);
}
//+---------------------------------------------------------------------------------+
#property description "This Expert Advisor loads the News from the site Investing.com without using .dll"
#import "kernel32.dll"
void GetLocalTime(int& a0[]);
int GetTimeZoneInformation(int& a0[]);
#import
#property strict
input bool Auto_GMToffset = TRUE;
input int Manual_GMToffset = 0; // Your GMT (for news)
input double RandomOpenMinuteDelay = 5.0;
input int BeforeNewsAlert = 5; // Внимание до новости, минуты
input bool NewsHard = true; // Enable hard news
input bool NewsMedium = false; // Enable medium news
input bool NewsLight = false; // Enable light news
input string NewsSymb = ""; // Валюта для отображения новостей (пусто - только текущая валюта)
input bool DrawLines = true; // Линии новостей на графике
input bool Next = false; // Только будующие новостные линии
input bool Signal = false; // Сигналы о предстоящих новостях
input bool flagAlert = false; // Флаг выставления Алертов
color highc = clrRed; // Color of important news
color mediumc = clrBlue; // Color of medium news
color lowc = clrLime; // Сolor of weak news
int Style = 0; // Line style
int Upd = 43200; // Period news updates in seconds (12 часов)
//----
int NomNews=0,
Now=0,
sumNew=0;
datetime LastUpd;
string symb;
string NewsArr[4][1000];
double ChNw=0, // Техническая переменная появления/исчезновения новости.
CheckNews=0;
//----
//----
int GMToffset,
LoclTime;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(StringLen(NewsSymb)>1)
symb=NewsSymb;
else
symb=Symbol();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0,OBJ_VLINE);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if (!IsDllsAllowed())
{
Alert("DLLs are disabled. To enable tick the checkbox in the Common Tab of Advisor");
return;
}
AutoGMToffset();
string display ="\n GMT: " + TimeToStr(LoclTime,TIME_MINUTES);
if (GMToffset>0)
display = display + "\n Broker TimeZone GMT: +" + GMToffset;
else
display = display + "\n Broker TimeZone GMT: " + GMToffset;
int Myoffset = + ((TimeLocal() - LoclTime) / 3500);
if (Myoffset>0)
display = display + "\n Your TimeZone GMT: +" + Myoffset;
else
display = display + "\n Your TimeZone GMT: " + Myoffset;
Comment (display);
if(TimeCurrent()-LastUpd>=Upd)
{
Comment("Загрузка новостей...");
UpdateNews();
LastUpd=TimeCurrent();
}
if(DrawLines)
LinesDraw();//--------------- Рисуем линии новостей на графике -------------+
if(BeforeNewsAlert>0 && TimeCurrent()+BeforeNewsAlert*60<TimeNewsFunck(1)&& StringFind(symb,NewsArr[1][1])>=0)
Alert("Attention!!!There are ", BeforeNewsAlert," minutes left before the news.");
}
//+---------------------------------------------------------------------------------+
// Скачать исходный код HTML страницы текстовой переменной. Возвращает результат //
//+---------------------------------------------------------------------------------+
string Read_HTML()
{
string cookie=NULL,headers;
char post[],result[];
string TXT="";
int res;
// Для работы с сервером необходимо добавить URL-адрес "https://www.google.com/finance"
// в список разрешенных URL-адресов (главное меню - > Сервис - > вкладка настроек " советники"):
string google_url="http://ec.forexprostools.com/?columns=exc_currency,exc_importance&importance=1,2,3&calType=week&timeZone=15&lang=1";
ResetLastError();
//--- Скачиваем html-страницу
int timeout=5000; //--- Тайм-аут менее 1000 (1 сек.) недостаточен при низкой скорости интернета
res=WebRequest("GET",google_url,cookie,NULL,timeout,post,0,result,headers);
//--- Проверка ошибок
if(res==-1)
{
Print("WebRequest error, err.code =",GetLastError());
MessageBox("You must add the address ' "+google_url+"' in the list of allowed URL tab 'Advisors' "," Error ",MB_ICONINFORMATION);
//--- You must add the address ' "+ google url"' in the list of allowed URL tab 'Advisors' "," Error "
}
else //------------------------- Успешная загрузка -----------------------------------------------
{
PrintFormat("File successfully downloaded, the file size in bytes =%d.",ArraySize(result));
int filehandle=FileOpen("news-log.html",FILE_WRITE|FILE_BIN);//-------------------- Сохраняем данные в файле
if(filehandle!=INVALID_HANDLE) //----------------------------------------------------------- проверка ошибки
{
FileWriteArray(filehandle,result,0,ArraySize(result));//---Сохраняем содержимое массива result [] в файле
FileClose(filehandle);//------------------------------------------------------------------ Закрываем файл
int filehandle2=FileOpen("news-log.html",FILE_READ|FILE_BIN);
TXT=FileReadString(filehandle2,ArraySize(result));
FileClose(filehandle2);
}
else
{
Print("Error in FileOpen. Error code =",GetLastError());
}
}
return(TXT);
}
//+---------------------------------------------------------------------------------+
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) + GMToffset*3600));
}
//+---------------------------------------------------------------------------------+
1. Необходимо ввести функцию закрытия ордеров — вначале "+", затем минус. Денег не добавит, зато картинка симпатичнее будет.
2. Полосы после подтверждения статус не меняют, отсюда погрешности в принятии решения.
3. Открытие усредняющих ордеров против нас решение, наверно, лучше, чем по сетке, но при правильно организованной сетке, могли бы уменьшить просадку.
4. Ну если Вы усредняетесь от полосы к полосе, то логично и ордера закрывать частями по «полосам».
Например, отыграли 40% предыдущего ZZ — закрыли треть ордера и в BU+. 60% — еще треть ордера. И стали на трал от BU+.
Таким образом, увеличив стартовый лот, получали бы аналогичную прибыль при снижении просадки как минимум на 70%.
kvashnin007