//+------------------------------------------------------------------//////////+------------------------------------------------------------------#property copyright"ROMANBEST"#property link"rshiredchenko@mail.ru"#property indicator_separate_window#property indicator_buffers2#property indicator_color1 clrLimeGreen#property indicator_color2 clrBlue// Цвет второй линии//#property indicator_color3 clrGray // Цвет третьей линии - гистограммы//---- buffersexternint MaxDrawTicks=100;
externint Num_Aver_of_Ticks=15;
//--- Создаём динамические массивыdouble ExtMapBuffer1[]; // Индикаторный массив значений цен Biddouble ExtMapBuffer2[]; // Индикаторный массив значений цен Ask // Кол-во тиков для среднего Num_Aver_of_Ticks / кол-во секунд, за которое эти тики поступили // При обращении к любому члену массива по индексу (допустим i) нужно убедиться что i>=0 и i<ArraySize(High) double ExtMapBuffer3[]; // Массив значений времени в сек. с момента запуска индикатора
int size; // Вспомогательная переменная для массива// При обращении к любому члену массива по индексу (допустим i) нужно убедиться что i>=0 и i<ArraySize(High) int myBars;
int i;
int delimeterCounter;
int _start,tickCounter;
double Sec_at_Num_Aver_of_Ticks; // кол-во секунд, за которое поступило среднее количество тиков для расчёта // (Num_Aver_of_Ticks)//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int init()
{
//---- indicatorsSetIndexBuffer(0, ExtMapBuffer1); // Назначение массива буферуSetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2); // Стиль линии SetIndexEmptyValue(0,0.0);
SetIndexBuffer(1, ExtMapBuffer2); // Назначение массива буферуSetIndexStyle (1,DRAW_LINE,STYLE_SOLID,2); // Стиль линии SetIndexEmptyValue(1,0.0);
//--- устанавливаем размер динамического массиваif(ArrayResize(ExtMapBuffer3,MaxDrawTicks)<0) {Print(" Ошибка в изменении размера массива времени поступления тиков "); return(false);}
//--- установим индексацию для буфера как в таймсерии для динамического массива// ArraySetAsSeries(ExtMapBuffer3,true);//--- Возвращает количество элементов указанного массива.
size=ArraySize(ExtMapBuffer3);
if (size>0) Print("Размер массива: ",size);
elsePrint("Ошибка. Массив пустой ",size);
// for(int i=0;i<=100;i++) Print(" ExtMapBuffer3[i] = ", ExtMapBuffer3[i]); //--- заполняем начальные 50 элементов значением 4// ArrayFill(ExtMapBuffer3,0,50,4);//--- заполняем 50 элементов (начиная с 50-го) значением 8// ArrayFill(ExtMapBuffer3,50,50,8);//--- выводим значения всех элементов// for(int i=0;i<ArraySize(ExtMapBuffer3);i++) Print(" i = ", i, " ExtMapBuffer3 = ", ExtMapBuffer3[i]); // ------------Print("Обнуляем тики и время их поступления");
for (i=Bars-1;i>=0;i--) { ExtMapBuffer1[i]=0.0; ExtMapBuffer2[i]=0.0; ExtMapBuffer3[i]=0.0;}
//--- запомним начальное значение для подсчёта секунд c момента старта системы
_start = GetTickCount();
//----return(0);
}
//+------------------------------------------------------------------+//| Custom indicator deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//----//----return(0);
}
//+------------------------------------------------------------------+//| сдвинем массив |//+------------------------------------------------------------------+void SetDelimeter()
{
//----string delimeterDate=TimeToStr(Time[0]);
if (myBars!=0)
{
Print("Ставим разделитель");
int handle=WindowFind("Ticks");
if(!ObjectCreate(delimeterDate,OBJ_VLINE,handle,Time[0],0))
{
Print("Неудачная попытка создания разделителя в окне ",
handle," по времени ",TimeToStr(CurTime()));
Print("Ошибка №",GetLastError(),", имя разделителя ",delimeterDate);
}
else
{
ObjectSet(delimeterDate,OBJPROP_COLOR,DarkGreen);
ObjectSet(delimeterDate,OBJPROP_STYLE,STYLE_DASHDOT);
ObjectsRedraw();
}
}
//----
}
//+------------------------------------------------------------------+//| сдвинем массив |//+------------------------------------------------------------------+void ShiftArray()
{
//----int V_lines;
string delimeterName;
datetime firstTime;
int BarFirstTime;
if (tickCounter>2*MaxDrawTicks)
{
for (i=tickCounter;i>=MaxDrawTicks;i--) { ExtMapBuffer1[i]=0.0; ExtMapBuffer2[i]=0.0; ExtMapBuffer3[i]=0.0; }
tickCounter=MaxDrawTicks;
}
for(int cnt=tickCounter;cnt>0;cnt--)
{
ExtMapBuffer1[cnt]=ExtMapBuffer1[cnt-1];
ExtMapBuffer2[cnt]=ExtMapBuffer2[cnt-1];
ExtMapBuffer3[cnt]=ExtMapBuffer3[cnt-1];
}
V_lines=ObjectsTotal();
for (int z=0;z<V_lines;z++)
{
delimeterName=ObjectName(z);
if (ObjectFind(delimeterName)!=-1)
{
if (ObjectType(delimeterName)==OBJ_VLINE)
{
firstTime=ObjectGet(delimeterName,OBJPROP_TIME1);
BarFirstTime=iBarShift(NULL,0,firstTime);
firstTime=Time[BarFirstTime+1];
ObjectSet(delimeterName,OBJPROP_TIME1,firstTime);
}
}
}
//----
}
//+------------------------------------------------------------------+//| признак нового бара |//+------------------------------------------------------------------+bool isNewBar()
{
//----bool res=false;
if (myBars!=Bars)
{
res=true;
myBars=Bars;
}
//----return(res);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+int start()
{
//--- выводим значения всех элементов// for(int i=0;i<ArraySize(ExtMapBuffer3);i++) Print(" i = ", i, " ExtMapBuffer3 = ", ExtMapBuffer3[i]); //--- получим время в миллисекундах, прошедших с момента старта системы uint time_ms=GetTickCount() - _start;
//--- получим время в секундах, прошедших с момента старта системы double time_s=time_ms/1000;
double X; // вспомогательная переменная int counted_bars=IndicatorCounted();
//----if (isNewBar())
{
// установить разделитель//tickCounter++;
SetDelimeter();
ExtMapBuffer1[0]=Bid;
ExtMapBuffer2[0]=Ask;
//ExtMapBuffer3[0]= time_s; //--- заполняем c tickCounter элементов значением time_s// ArrayFill(ExtMapBuffer3,tickCounter,1,time_s); if (tickCounter >= 0 && tickCounter < ArraySize(ExtMapBuffer3) && tickCounter <= Num_Aver_of_Ticks)
{
//--- заполняем начальный и последующие элементы значениями time_sif (tickCounter == 0) ArrayFill(ExtMapBuffer3,0,1,time_s);
elseArrayFill(ExtMapBuffer3,tickCounter,1,time_s);
//--- выводим значение элементаfor( i=0;i<1;i++) Print(" tickCounter = ", tickCounter, " ExtMapBuffer3 = ", ExtMapBuffer3[tickCounter]);
}
}
else
{
tickCounter++;
ShiftArray();
ExtMapBuffer1[0]=Bid;
ExtMapBuffer2[0]=Ask;
ExtMapBuffer3[0]= time_s;
// массив // индекс начального элемента // количество элементов // значение, которым заполняется массив //--- заполняем начальные (с нуля) tickCounter элементов значением time_s//ArrayFill(ExtMapBuffer3,tickCounter,1,time_s); // X = tickCounter/time_s; if (tickCounter >= 0 && tickCounter < ArraySize(ExtMapBuffer3) && tickCounter <= Num_Aver_of_Ticks)
{
//--- заполняем начальный и последующие элементы значениями time_sif (tickCounter == 0) ArrayFill(ExtMapBuffer3,0,1,time_s);
elseArrayFill(ExtMapBuffer3,tickCounter,1,time_s);
//--- выводим значение элементаfor( i=0;i<1;i++) Print(" tickCounter = ", tickCounter, " ExtMapBuffer3 = ", ExtMapBuffer3[tickCounter]);
}
}
/*
if (tickCounter > Num_Aver_of_Ticks) то ищем индекс массива с минимумом http://docs.mql4.com/ru/array/arrayminimum и заполняем его значением секунд
следующего тика... Потом считаем разность между этим значением и следующим минимумом...
Псле заполнения массива до ExtMapBuffer3[Num_Aver_of_Ticks]. Читать минимум, максимум. Переписываем минимум. Разница значений
ExtMapBuffer3[максимум] и ExtMapBuffer3[минимум] будет время в секундах поступления Num_Aver_of_Ticks.
*/
Sec_at_Num_Aver_of_Ticks = time_s - ExtMapBuffer3[Num_Aver_of_Ticks];
if (tickCounter >= Num_Aver_of_Ticks && (time_s - ExtMapBuffer3[Num_Aver_of_Ticks])!=0)
X = Num_Aver_of_Ticks / (time_s - ExtMapBuffer3[Num_Aver_of_Ticks]);
if (time_s!=0)
Comment(
"tickCounter = ", tickCounter, "\n",
"secondCounter = ", NormalizeDouble(time_s,Digits) , "\n",
"ExtMapBuffer1[0] = ", NormalizeDouble(ExtMapBuffer1[0],Digits) , "\n",
"ExtMapBuffer2[0] = ", NormalizeDouble(ExtMapBuffer2[0],Digits) , "\n",
"ExtMapBuffer3[0] = ", NormalizeDouble(ExtMapBuffer3[0],Digits) , "\n",
"Average speed for average quantity of tics = ", NormalizeDouble(X,2), " Num_Aver_of_Ticks/Sec_at_Num_Aver_of_Ticks ", "\n",
"Num_Aver_of_Ticks = ", Num_Aver_of_Ticks," Время в секундах поступления Num_Aver_of_Ticks = ",Sec_at_Num_Aver_of_Ticks , "\n",
"Average speed since running = ", NormalizeDouble(tickCounter/time_s,Digits) , " All Tick/All Second ", "\n",
"") ;
//----return(0);
}
//+------------------------------------------------------------------+
1.现在看一下屏幕分辨率和比例。我不知道如何在8.1上做这个,我自己目前在10上。你显然把所有的控制权都转移了。这是典型的,当你为一个标准的尺度写一个程序,而用户通常把它设置成一个更大的尺度。你那里没有带小屏幕的笔记本,是吗?他们通常会放大,因为很难看到小的元素。
这是它在10上的设置方式。
2.你必须将其设置为标准 - 100%
1.我有一台带 "大 "屏幕的笔记本电脑...:-)
2.所以我做了。
谢谢你的帮助...
1.我有一个带 "大 "屏幕的笔记本...:-)
2.所以我做了。
谢谢你的帮助...
在阅读问题时,也想到了这个决议--被打到了答案。
你自己明白--为任何设备的所有屏幕编写一个平台是不现实的)
我也在想这个决议,当我读到这个问题时,你抢先了一步。
你知道,不可能为任何设备的所有屏幕编写一个平台)
感觉...:-)很久没有来这里了...商业...:-)
同样的老面孔。有什么好的!?
虽然你看不到很多人...
我也在想这个决议,但当我读到这个问题时,答案就在我前面了。
你自己明白--为任何设备的所有屏幕编写一个平台是不现实的)
我不记得,也无法在文档中找到如何在F7调用的窗口中分割EA参数的注释行。
如何使它像在Excel中一样))
一切工作都很好!!!!这不是算法的问题。这个问题已经解决。
在此决定的是四人组。
有指标代码。它计算并绘制 上升线和下降线+计算在Sec_at_Num_ Aver_ of_Ticks 秒内收到的新鲜 Num_Aver_of_Ticks的平均速度X。 X = Num_Aver_of_Ticks / (time_s - ExtMapBuffer3[Num_Aver_of_Ticks]) 。
我如何在EA中读取这个变量 X 的值 (见start函数的结尾)?
在此决定的是四人组。
有指标代码。它计算并绘制 上升线和下降线+计算在Sec_at_Num_A ver_ of_Ticks 秒内收到的新鲜 Num_A ver_of_Ticks的平均速度X。 X = Num_Aver_of_Ticks / (time_s - ExtMapBuffer3[Num_Aver_of_Ticks])。
我如何在EA中读取这个变量 X 的值 (见start函数的结尾)?
在平板电脑上看代码是很困难的,但答案是不可避免的--在缓冲区中写入值X。
谢谢你。Artyom.对我来说也是如此...:-)
我很久以前就写过这个起诉书,并以Rosha在kodobase的代码为基础。