#define EXPERT_MAGIC 261// MagicNumber экспертаinputstring Symbol_T = "XAUUSD"; // глобальная переменная для задаваемого символа
..............
for(int i = PositionsTotal()-1; i >= 0; i--)
{
if(PositionGetTicket(i) > 0 && PositionGetString(POSITION_SYMBOL) == Symbol_T && PositionGetInteger(POSITION_MAGIC) == EXPERT_MAGIC)
{
int attempts = 0; // счетчик попытокbool success = false; // флаг успешного выполнения копирования тиковMqlTick tick_array[]; // массив для приема тиков//--- сделаем 3 попытки получить тикиwhile(attempts < 3)
{
//--- замерим время старта перед получением тиковuint start = GetTickCount();
//--- дата, по которую запрашиваются тики (время открытия позиции)datetime Time_Open = (datetime)PositionGetInteger(POSITION_TIME);
//--- дата, с которой запрашиваются тики (достаточно взять на 30 секунд раньше открытия позиции)datetime Time_Start = (datetime)(Time_Open-30);
//--- запросим тиковую историю с момента Time_Start до момента Time_Openint received = CopyTicksRange(Symbol_T, tick_array, COPY_TICKS_ALL, Time_Start*1000, Time_Open*1000);
if(received != -1)
{
//--- выведем информацию о количестве тиков и затраченном времениPrintFormat("%s: received %d ticks in %d ms", Symbol_T, received, GetTickCount()-start);
//--- если тиковая история синхронизирована, то код ошибки равен нулюif(GetLastError()==0)
{
success = true;
break;
}
elsePrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", Symbol_T, received, GetTickCount()-start, _LastError);
}
//--- считаем попытки
attempts++;
//--- пауза в 1 секунду в ожидании завершения синхронизации тиковой базыSleep(1000);
}
//--- не удалось получить запрошенные тики от самого начала истории с трех попыток if(!success)
{
PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток", Symbol_T);
//return; (вставить, если цикл находится внутри функции типа void)
}
//--- узнаем количесто элементов в массивеint ticks = ArraySize(tick_array);
//--- выведем bid последнего тика в массиве перед самым открытием позицииdouble last_bid_before_priceopen = tick_array[ticks-1].bid;
Print("BID последнего тика: ", tick_array[ticks-1].bid);
//--- выведем ask последнего тика в массиве перед самым открытием позицииdouble last_ask_before_priceopen = tick_array[ticks-1].ask;
Print("ASK последнего тика: ", tick_array[ticks-1].ask);
//--- узнаем цену, по которой была открыта позицияdouble Position_PriceOpen = PositionGetDouble(POSITION_PRICE_OPEN);
if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
//--- вычислим размер последнего тика, на котором была открыта позиция (для BUY позиции открытие было по цене ASK)double size_last_tick_ASK = NormalizeDouble(fabs(Position_PriceOpen - last_ask_before_priceopen), _Digits);
}
elseif((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
//--- вычислим размер последнего тика, на котором была открыта позиция (для SELL позиции открытие было по цене BID)double size_last_tick_BID = NormalizeDouble(fabs(last_bid_before_priceopen - Position_PriceOpen), _Digits);
}
}
}
//Проверка и расчёт количества просчитываемых баровint limit = rates_total-prev_calculated;
if(limit==1)
limit=2;
//-------------------------------------------------------------------------//Расчёт индикатораfor(int i=limit-1; i>=0; i--)
{
c = iClose(_Symbol,PERIOD_CURRENT,i);
IndBuff[i] = c; //на этой строке array out of range
}
大家好。请您告知,在专家顾问的测试 模式下,是否执行Sleep()(当然是在真实的ticks上测试)?
在进行中 - 测试仪的时间被改变了一个适当的数量。
执行 - 测试仪的时间被改变了一个适当的数量。
非常感谢您!
是否有可能在mql5中找到非常的tick的大小,之后开仓?
事实证明,你可以。for循环被插入到一个单独的函数中,在OnTick()函数中或由你自己决定。我对其他人的意见感兴趣。例如,我需要它来创建一个超精确的系统。因此,我写的是没有库,包括开仓和平仓的函数。谁说的,mqh库拖慢了工作,例如编译需要1.5倍的时间。 最好把所有东西都写在一个文件里。MQL5永远不会成为C++水平的语言,它是有限的。重点是在图书馆。
我受够了这个错误--有一个指标,有一个专家正在研究它。我改变了指标并重新编译。 在图表上可以清楚地看到指标的变化--专家顾问在测试器中运行--但就像它没有改变任何东西一样。同样的结果。
如果我重新启动终端并通过测试器后,它将产生一个新的代码。
这个黑客是什么,我不明白。
我删除了指标ex5。测试仪继续运行,好像什么都没有发生。它从哪里获得文件来运行????
3184
指标中的怪异行为。
for循环进入主体,不是在每个tick 上,而是在一个新的蜡烛上才有一次。
但i == 0,而给定条件允许i>=0
在同一棒的tick上limit = 0
,所以i的第一个值=-1,条件i>=0
,这就是为什么它没有进入循环。
在同一根柱子的刻度线上极限=0
所以第一个值i=-1,条件i>=0
,这就是为什么它没有进入循环。
谢谢,我错过了那个。
但现在指标缓冲区IndBuff[i]正在做它的头,数组超出了范围。
它需要什么?为什么不分配到初始i=limit?
谢谢,错过了那个。
但现在指标缓冲区IndBuff[i]在做脑筋急转弯,数组超出了范围。
它需要什么?为什么不分配到初始i=limit?
因此,在每个条形图上,它都会进入一个循环,而它需要在每个刻度上进入一个循环。
以前的工作方式是这样的
对于i>=0的刻度。
对于酒吧i>0
现在我不知道如何处理缓冲区的问题。
这是因为IndBuff没有分配给rate_total + 1
而且ArrayResize 也不适用于它。
他们打破了构造。现在我们必须用if-arses来做所有的事情?