0
Посмотрел запись теста, уменьшив скорость в 4 раза. Если бы еще разрешение графика можно было бы уменьшить…
1. Необходимо ввести функцию закрытия ордеров — вначале "+", затем минус. Денег не добавит, зато картинка симпатичнее будет.
2. Полосы после подтверждения статус не меняют, отсюда погрешности в принятии решения.
3. Открытие усредняющих ордеров против нас решение, наверно, лучше, чем по сетке, но при правильно организованной сетке, могли бы уменьшить просадку.
4. Ну если Вы усредняетесь от полосы к полосе, то логично и ордера закрывать частями по «полосам».
Например, отыграли 40% предыдущего ZZ — закрыли треть ордера и в BU+. 60% — еще треть ордера. И стали на трал от BU+.
Таким образом, увеличив стартовый лот, получали бы аналогичную прибыль при снижении просадки как минимум на 70%.
avatar

kvashnin007

  • 28 апреля 2022, 21:29
0
Да, и что Вы думаете про испорченный клюв индюка?
avatar

kvashnin007

  • 28 апреля 2022, 20:43
0
Сергей, здравствуйте.
Знаете, даже не тестировал. Идея понятная, но…
Я озабочен безрисковой торговлей. То бишь — не важно куда идет цена, важно что она идет. Хоть куда-то. В наше время такая бешанная волатильность, что можно было бы хорошо подняться.
Скоро эта вакханалия закончится сама по себе. Биржи, конечно же, останутся, но прежних наваров спекулянтам уже будет не видать. Цена приблизится максимально к стоимости. Ну тогда и все стратегии изменятся.
И просадка 63% будет равносильна сливу.

Сергей, я понимаю, что Вы не гуру программирования, но человек разумный. Общение с Вами все равно бонус. Может Вы бы присмотрелись к моему блогу?
Там далеко не все озвучено.
avatar

kvashnin007

  • 28 апреля 2022, 20:16
0
Забросил. Так сам себе ковыряюсь. На призыв совместно потрудиться откликнулся один человек и тот канут в лету. А интерес одному ковыряться?
Это уже пройденный этап. Так что, как-то так.

На счет RSI точно не помню, где я его втыкал. Скорее, стартовый толчок. Советнику в принципе не важно в какую сторону и когда стартовать, но кто-то же должен сказать: -«Родной, пора.» Сам не люблю индюшатину, но иногда пользую. Тем более, что для стратегии лучше сознательный противосигнал.

Искал, где «об этом давно написано», но не нашел.

Идея советника гораздо шире, чем написано. Но эта инфа только для заинтересованных участников, а не для наблюдателей, делающих ставки.
Там нужны будут, подозреваю, таблицы и их учет-отчет-расчет. Робот то математический. В роботе еще предполагаются три моих разработки, предохраняющих от слива, и даже позволяющие зарабатывать на просадках.
Но в таблицах я ниже отметки «0». Вот и пытался найти более продвинутых собутыльников. Но… Бухаю сам.
avatar

kvashnin007

  • 28 апреля 2022, 19:59
0
Когда-то не довел до ума новостной советник, парсящий другой новостной сайт. В планах был реверс ордеров, при закрытии по тралу. Новостные скачки уже «спрогнозированы» ценой, а вероятность самого отката приближается к 100%. Гарантированно можно отжимать 45-65% на откат бОльшим лотом. Плюс спред получше и реквот поменьше.
Забросил в связи с тем, что за булки подержаться не мог. Где протестить? И как? Я неимоверно ленив.

Могу кинуть. Там и тралы были ускоряющиеся. Само по себе интересное явление. Но там большой размер. Около 1400 строк, если склероз не подводит. Не помню, как называется, но… был такой интерес.

Ну а в Сибири тихий час. Наверно дрыхнут все.
avatar

kvashnin007

  • 26 апреля 2022, 00:02
0
Матерщинник.
avatar

kvashnin007

  • 25 апреля 2022, 20:32
0
Да, и кстати, спред относится к этим мелочам, только смысла не так уж и много.
avatar

kvashnin007

  • 25 апреля 2022, 20:07
0
Жаль.

тогда для меня это был высший класс.

А с другой стороны, считали сайт, распассили код и вуаля. Честно, я от этого далек.
avatar

kvashnin007

  • 25 апреля 2022, 20:04
0
В настоящее время термин используется редко; его основное современное значение близко к понятию ферментопатия…

Пришлось в википедию залезть. Это не матом. Тогда можно.

Я Вас ни к чему не призываю. Просто анализирую, что могу и выражаю свое «ФЭ».
ДУМАЮ, ДЛЯ ВАШЕЙ ПОЛЬЗЫ.
avatar

kvashnin007

  • 25 апреля 2022, 20:01
0
Я пенсионер-бездельник. Времени валом. Желанию всегда можно придать волшебного пенделя.

То есть, «всегда и с удовольствием.» Вдвоем, чтоб не скучно было.
Это кредо, обожаемо многими, особенно женщинами.
avatar

kvashnin007

  • 25 апреля 2022, 16:07
0
ЕСЛИ ВСЕ ТАК ХУДО, ТО БОЛЬЩЕ НИЧЕГО КРИМИНАЛЬНОГО ВНЕШНЕ НЕ ОБНАРУЖИЛ.
Слово «внешне» без контекстов. Просто остальное выглядит шикарно. Идея, высказанная в привате, требует практического изучения.
А это плохо совместимый Tweaks. Время и желание. Б-рррр…
avatar

kvashnin007

  • 25 апреля 2022, 15:56
0
Перезалил с русскими пояснениями.
Когда-то работало, сейчас не проверял.
Код для меня тяжелый. Одни стринги (если они не на женщине) меня убивают, а слово типа «парсить»… Ну просто ужас форменный.
avatar

kvashnin007

  • 25 апреля 2022, 15:28
0
Слушайте, руки зачесались более того. Мабуть чесотка таки.
Теперь я знаю и про богов и богиню этой планеты.
А где взять именно тот код?
avatar

kvashnin007

  • 25 апреля 2022, 14:56
0
Вторая часть

//+---------------------------------------------------------------------------------+
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);
}
//+---------------------------------------------------------------------------------+

avatar

kvashnin007

  • 25 апреля 2022, 13:10
0
Когда-то баловался с новостями (интересная тема) и получил код.
Посмотрите, может пригодится.


#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));
}
//+---------------------------------------------------------------------------------+
avatar

kvashnin007

  • 25 апреля 2022, 13:08
0
Отскок от поддержки с образованием пинбара (описание изо), судя по рисунку, образовался на смене суток или, даже, недели. На Н4, проблем не вижу. Но есть же народ и поуже в плечах.

Думаю для таких необходимо предусмотреть контроль спреда.
Или наоборот, так им и надо?
avatar

kvashnin007

  • 25 апреля 2022, 13:01
0
Ок!
У меня руки чешутся индюку фейс попортить.

Как я понял, самого индюка Вы оставили снаружи, не внося его в тело совы.
avatar

kvashnin007

  • 25 апреля 2022, 12:45
0
Сам такой и других плохому обучаю.

Почему не сделать extern ENUM_TIMEFRAMES TF =PERIOD_CURRENT;?
avatar

kvashnin007

  • 25 апреля 2022, 12:25
0
Судя по изо, индюк много уровней пропускает.
Или он какие-то после отработки удаляет?
Тогда не все!?
avatar

kvashnin007

  • 25 апреля 2022, 11:14
0
extern ENUM_TIMEFRAMES TF =PERIOD_CURRENT;

Итак бесконечно в вечность.
Заметил одну интересную штуку: чем больше улучшаешь, тем хуже работает.

Удачи.
avatar

kvashnin007

  • 25 апреля 2022, 10:57