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

 
rabanik:
Добрый день. Помогите написать следующий код, для советника. Хочу сделать через массив (если имеется более оптимальный вариант, прошу помочь). В общем советник отсылает сообщения, но я хочу чтобы советник отсылал их через массив (временный). Т.е. при начале отправки письма советник проверял не отправляли ли данное сообщение раньше (проверял наличие такого сообщения в массиве), если нет отправлял, если письмо находится то отправка опускается. Надеюсь понятно) Спасибо, большое!

Вы точно уверены в постановке задачи?

Просто, существуют варианты:

- не повторять последнее сообщение

- игнорировать устаревшее (задан какой-то лаг по времени), то есть, нужно повторять сообщение.

P.S. Первый вариант - частный случай второго, но, реализуется на порядок проще. Ваша постановка задачи - тоже частный случай второго варианта с бесконечным лагом.

Если Вам это интересно, то, вот решение Вашей задачи.

Определяем два массива - один текстовый, который хранит сообщения, второй - индексный, для поиска сообщений.

Индексный массив имеет тип int. В первом измерении записываем контрольную сумму текстового сообщения. Во второе - номер строки сообщения первого массива. Индексный массив сортируем по первому измерению.

Получаем новое сообщение. Считаем его контрольную сумму. С помощью функции ArrayBsearch() ищем такое сообщение. Если оно не найдено, то это сообщение оригинально. Добавляем его в массив сообщений и, контрольную сумму со ссылкой в индексный массив, не забыв его отсортировать.

Какие варианты для контрольной суммы? Я бы взял такой: учитываем число символов и контрольную сумму текста. Контрольная сумма текста, например, сумма кодов символов. С учетом последних изменений она не может превосходить 65 536*256. То есть, контрольная сумма сообщения может выглядеть так:

число символов умножаем на 10 миллионов и прибавляем контрольную сумму текста.

 

профи! есть проблема с линией по углу.

построил TRENDBYANGLE по координатам

ObjectCreate(0,"anglestok",OBJ_TRENDBYANGLE,0,0,0);
ObjectSet("anglestok",OBJPROP_TIME1,X1); ObjectSet("anglestok",OBJPROP_PRICE1,Y1);
ObjectSet("anglestok",OBJPROP_TIME2,X2); ObjectSet("anglestok",OBJPROP_PRICE2,Y2);

- нужно узнать угол, делаю

anglestok= ObjectGetDouble(0,"anglestok",OBJPROP_ANGLE);

 а он =0, в справке написанно что у линии созданной программой -угол НУЛЬ это ок. 

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

или дал одни координаты - спрашиваю угол - говорит 0. тут же даю другие - говорит угол прошлых координат. ерунда

 
Для каких случаев после описания сигнатуры функции ставят const ? Никак не удаётся найти информацию об этом.
void qwe(int abc) const {...}
 
Похоже тут не найти нормальных знающих людей, только зря зарегался =/
 
K_i_r_i_t_o:
Перенес коммент в начало, а то никто так и не ответил, а очень нужно =/
Можно ли это реализовать: если я нажимаю какую то клавишу, включается одна часть кода индикатора(отвечает за создание объекта ЩЕЛЧКОМ МЫШИ), потом если происходит какое то событие(вторая часть кода, событие может быть, создание того же объекта к примеру), то первая часть кода отключается(а если не сделать этого то объект создается каждым щелчком), и также запустится при нажатии на клавишу, и так по кругу)
Можно. Добавляй блок OnChartEvent. В нём следи за нужными нажатиями, измерениями и описывай реакцию на них согласно задумке.
 
SunnYtheDreamer:
Можно. Добавляй блок OnChartEvent. В нём следи за нужными нажатиями, измерениями и описывай реакцию на них согласно задумке.
Реализовать именно отключение части кода на срок до нажатия клавиши не получается =/  Есть вариант попроще, но тут одна проблема, нужно чтоб i при нажатии клавиши возращало свое значение в начало первого оператора if 
#define VK_D 0x44
void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam) // параметр события типа string 
{ 
 Comment(__FUNCTION__,": id=",id," lparam=",lparam," dparam=",dparam," sparam=",sparam);

int      y     =(int)dparam;
datetime dt    =0;
double   price =0;  
int      window=0;
int i;
int x=(int)lparam;

if (id==CHARTEVENT_CLICK)
{
ChartXYToTimePrice(0,x,y,window,dt,price);
ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);

if(id==CHARTEVENT_KEYDOWN) 
{ switch(int(lparam)) 
{ case VK_D:
i=rand();
}}}}
 
K_i_r_i_t_o:
Реализовать именно отключение части кода на срок до нажатия клавиши не получается =/  Есть вариант попроще, но тут одна проблема, нужно чтоб i при нажатии клавиши возращало свое значение в начало первого оператора if 
if (id==CHARTEVENT_CLICK)
{
   ChartXYToTimePrice(0,x,y,window,dt,price);
   ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
   ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);

   if(id==CHARTEVENT_KEYDOWN) 
   {
      switch(int(lparam)) 
      {
         case VK_D: i=rand();
      }
   }
}
Этот код будет исполнится только если кликнуть мышкой, при этом через 3 строчки кода проверяется событие нажатия клавиши. А эти 3 строчки кода исполнятся за несколько миллисекунд, и даже, если id в течении текущего вызова OnChartEvent способно измениться, то шанс, что в течении времени, исполнения 3х строк кода, будет нажата клавиша = 0%. Очевидно, что проверять id, внутри блока, что запускается при определённом значении id, и ждать там другого значения - бессмысленно. Сначала проверяй нажатие клавиши, в отдельном блоке, сохраняй в переменную номер клавиши или же просто сам факт нажатия нужной клавиши. И этой переменной включай или отключай кусок кода расположенный в блоке для клика мышки.
char key = -1; //эта переменная должна быть объявлена за пределами блока OnCharEvent
if(id==CHARTEVENT_KEYDOWN)
key = lparam;

if (id==CHARTEVENT_CLICK && key == 'D')
{
   ChartXYToTimePrice(0,x,y,window,dt,price);
   ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
   ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);
   i=rand();
   key = -1;
}
 
SunnYtheDreamer:
Этот код будет исполнится только если кликнуть мышкой, при этом через 3 строчки кода проверяется событие нажатия клавиши. А эти 3 строчки кода исполнятся за несколько миллисекунд, и даже, если id в течении текущего вызова OnChartEvent способно измениться, то шанс, что в течении времени, исполнения 3х строк кода, будет нажата клавиша = 0%. Очевидно, что проверять id, внутри блока, что запускается при определённом значении id, и ждать там другого значения - бессмысленно. Сначала проверяй нажатие клавиши, в отдельном блоке, сохраняй в переменную номер клавиши или же просто сам факт нажатия нужной клавиши. И этой переменной включай или отключай кусок кода расположенный в блоке для клика мышки.

Огромное спасибо!) вот эта строчка которую я искал if (id==CHARTEVENT_CLICK && key == 'D'), никак не мог два события соединить, вот это не работало if (id==CHARTEVENT_CLICK & id==CHARTEVENT_KEYDOWN) Еще раз большое спасибо)

 

здравствуйте , у меня есть одна функция , которая считает средний размер свечи по последним n свечам. и иногда выдает вот такие значения: "5e-05.0"  . они мне мешают и не нужны,  к моему стыду я не знаю количественно это сколько и как их отсечь . NormalizeDouble() не помогает . подскажите пожалуйста как такие числа вычислить програмно чтобы отсечь

 
pycha:

здравствуйте , у меня есть одна функция , которая считает средний размер свечи по последним n свечам. и иногда выдает вот такие значения: "5e-05.0"  . они мне мешают и не нужны,  к моему стыду я не знаю количественно это сколько и как их отсечь . NormalizeDouble() не помогает . подскажите пожалуйста как такие числа вычислить програмно чтобы отсечь


5е-05 (5*10 в -5 степени) =  0.00005.
Что бы отсечь, то:
if(val >= 0.00001)
Такие мелкие свечи, в 5 пипсов, только во время штиля, на 5-и знаковом счёте, на низких таймфреймах повстречать возможно. Если дел со скальпингом не имеете, но за n свечей среднее получается иногда столь маленькое, то реализация функции должна вызывать подозрения.
Причина обращения: