Techno: El problema no está en el procesador, sino en el código del EA, en algún lugar hay cuellos de botella, pero no se puede diagnosticar y arreglar con palabras, se necesita el código
Aquí hay un trozo de código responsable de cada tic.
//***********************************************************************
BarTime=Time[0];
}else// На каждый тик
{
Количество = OrdersTotal(); // Количество ордеров на данный момент for(i=Количество-1; i>=0;i--) // Цикл перебора ордер
{
if (OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий
{
Tip=OrderType(); // Определения типа ордераAlert("Tip ордера=",Tip,", количество по счёту = ",i);
//-------------------------------------------------------------------- switch(Tip) // Переключатель на типы ордеров
{
case0: Alert("Ордер BUY",", i = ",i); // Если ордер BUY
A=OrderMagicNumber();
Alert("ТЛ_ТP вверх =",ТЛ_ТPвверх[A],", Bid = ",Bid,", МодифBuy = ",МодифBuy[A],", A = ",A);
string Номер_ордера = OrderTicket(); // Имя для создания надписи ордера на терминалеstring текст = Номер_ордера + Пусто + С1; // Прибавление к надписи С1Alert("Номер_ордера вверх = ",Номер_ордера); // СообщениеObjectFind(Номер_ордера);
ObjectCreate(Номер_ордера,OBJ_TEXT,0,Время1 Син_вверх[A],O1C[A]); // Создание надписи номера ордера
ObjectSetText(Номер_ордера,текст,13,"Arial",вверх);// Задание свойств надписиdouble Выше = O1C[A]+4*Point; // Координата стрелки вверхstring Значок = Время1 Син_вверх[A]+1; // Имя для создания рисунка стрелкиObjectFind(Значок);
ObjectCreate(Значок,OBJ_ARROW,0,Время1 Син_вверх[A],Выше);// Создание обьекта стрелки
ObjectSet(Значок,OBJPROP_ARROWCODE,241); // Создание стрелки
ObjectSet(Значок,OBJPROP_COLOR,вверх); // Создание цвета стрелкиAlert ("Значок = ",ObjectSet(Значок,OBJPROP_ARROWCODE,241));
Error=GetLastError(); // Назначение имени функции проверки ошибокswitch(Error) // Указатель ошибки
{
case4200 : Alert("Объект уже существует");
break; // Выход из switchdefault: Alert("Другая ошибка ",Error); //Другие варианты
}
if (NormalizeDouble(Bid,Digits)>=NormalizeDouble(ТЛ_ТPвверх[A],Digits) && МодифBuy[A]==false && ТЛ_ТPвверх[A] != 0) // Если цена = или > туннельной линии
{
МодифBuy[A]=OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice(),Digits),OrderOpenPrice()+1*Point,OrderTakeProfit(),0);//МодифиAlert("МодифBuy=",МодифBuy);
if (МодифBuy[A]==true) // Получилось :)
{
Alert ("Ордер ",OrderTicket()," модифицирован:)");
break; // Из цикла модифи.
}
//--------------------------------------------------- 7 --
Error=GetLastError(); // Не получилось :(switch(Error) // Преодолимые ошибки
{
case130:Alert("Неправильные стопы");
break;
// Критические ошибкиcase2 : Alert("Общая ошибка.");
break; // Выход из switchcase133:Alert("Торговля запрещена");
break; // Выход из switchdefault: Alert("Возникла ошибка ",Error);//Др. ошибки
}
break; // Из цикла модифи.
}
break; // Выход из switchcase1: Alert("Ордер Sell , i = ",i); // Если ордер Sell
B=OrderMagicNumber();
Номер_ордера = OrderTicket(); // Имя для создания надписи ордера на терминале
текст = Номер_ордера + Пусто + С1; // Прибавление к надписи С1Alert("Номер_ордера вниз = ",Номер_ордера); // СообщениеObjectFind(Номер_ордера);
ObjectCreate(Номер_ордера,OBJ_TEXT,0,Время1 Син_вниз[B],O1C[B]); // Создание надписи номера ордера
ObjectSetText(Номер_ордера,текст,13,"Arial",вниз); // Задание свойств надписиdouble Ниже = O1C[B]-4*Point; // Координата стрелки вверх
Значок = Время1 Син_вниз[B]+1; // Имя для создания рисунка стрелкиObjectFind(Значок);
ObjectCreate(Значок,OBJ_ARROW,0,Время1 Син_вниз[B],Ниже); // Создание обьекта стрелки
ObjectSet(Значок,OBJPROP_ARROWCODE,242); // Создание стрелки
ObjectSet(Значок,OBJPROP_COLOR,вниз); // Создание цвета стрелкиAlert ("Значок = ",ObjectSet(Значок,OBJPROP_ARROWCODE,242));
Error=GetLastError(); // Назначение имени функции проверки ошибокswitch(Error) // Указатель ошибки
{
case4200 : Alert("Объект уже существует");
break; // Выход из switchdefault: Alert("Другая ошибка ",Error); //Другие варианты
}
Alert("ТЛ_ТP вниз =",ТЛ_ТPвниз[B],", Bid = ",Bid,", МодифSell = ",МодифSell[B], ", B = ",B);
if (NormalizeDouble(Bid,Digits)<=NormalizeDouble(ТЛ_ТPвниз[B],Digits) && МодифSell[B]==false && ТЛ_ТPвниз[B] != 0) // Если цена = или > туннельной линии
{
МодифSell[B]=OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice(),Digits),OrderOpenPrice()-1*Point,OrderTakeProfit(),0);//МодифиAlert("МодифSell=",МодифSell[B]);
if (МодифSell[B]==true) // Получилось :)
{
Alert ("Ордер ",OrderTicket()," модифицирован:)");
break; // Из цикла модифи.
}
//--------------------------------------------------- 7 --
Error=GetLastError(); // Не получилось :(switch(Error) // Преодолимые ошибки
{
case130:Alert("Неправильные стопы");
break;
// Критические ошибкиcase2 : Alert("Общая ошибка.");
break; // Выход из switchcase133:Alert("Торговля запрещена");
break; // Выход из switchdefault: Alert("Возникла ошибка ",Error); //Др. ошибки
}
break; // Из цикла модифи.
}
break; // Выход из switchdefault: Alert("Другие ордера",", i = ",i);
}
}
} //Конец перебора орд.
} // Конец условия есть новая свеча или нет Alert("ТЛ_ТP вниз[",B,"] = ",ТЛ_ТPвниз[B],", ТЛ_ТP вверх[",A,"] = ",ТЛ_ТPвверх[A]);
return(0); // Выход из start()
}
//+------------------------------------------------------------------+
Perdón por los dos posts - no caben en uno.
¿Quizás puedas ver que la velocidad de puntuación del probador está disminuyendo?
¿Tal vez pueda ver que la velocidad de puntuación del probador está disminuyendo?
Bueno, es seguro decir que todo el manejo de errores, y las funciones de texto (encontrar, crear) son innecesarias, así como las Alertas. Sin ellos todo funcionará más rápido. Eso es todo sobre este trozo de código.
¿Quizás puedas ver que disminuye la velocidad de conteo en el probador?
Los gráficos son definitivamente más lentos.
Y no olvides que en mql4 hay un cálculo completo de las condiciones en if(), es decir, si tienes varios && entonces se calcularán y compararán todos los valores, aunque un false es suficiente para que la construcción con && sea falsa
if (NormalizeDouble(Bid,Digits)<=NormalizeDouble(ТЛ_ТPвниз[B],Digits) && МодифSell[B]==false && ТЛ_ТPвниз[B] != 0) // Если цена = или > туннельной линии
es posible dividirlo en varios if()
if (МодифSell[B]==false) // Если цена = или > туннельной линии
{ if(NormalizeDouble(Bid,Digits)<=NormalizeDouble(ТЛ_ТPвниз[B],Digits) && ТЛ_ТPвниз[B] != 0)
{
...........
en este caso, después de que el primer if() no se tenga en cuenta, no se considerará toda la construcción siguiente
Techno: de hecho este código sólo realiza 2 modificaciones de orden, todo lo demás es obviamente superfluo...
Nikolay, gracias. He eliminado las alertas y la gestión de errores. No puedo notar ninguna ganancia de velocidad visual. Sí, aquí se modifican las órdenes y se muestra gráficamente el número de orden de mercado y el lugar de su condición de apertura. Dejé las funciones de texto ya que marcan en el gráfico qué orden se abrió (es necesario para el análisis posterior).
volshebnik: Nikolai, gracias. He eliminado todas las alertas y el manejo de errores. No hay un aumento visible de la velocidad. Sí, aquí se modifican las órdenes y se indica gráficamente el número de orden y el lugar de la condición de abierto. He dejado las funciones de texto ya que marcan en el gráfico qué orden se ha abierto (lo necesitamos para el análisis posterior).
Tenemos que encontrar otra forma de análisis, las funciones gráficas son muy lentas
Techno: hay que buscar otra forma de analizar, las funciones gráficas son muy lentas
Podrías meter todos los gráficos en una función separada y llamarla con una condición. Aunque pensaba que las funciones gráficas y las alertas no funcionan cuando se optimiza, y no reducen la velocidad de las pruebas.
granit77: Podrías meter todos los gráficos en una función separada y llamarla con una condición. Aunque pensé que al optimizar, las funciones gráficas y las alertas no funcionan, y no reducen la velocidad de la prueba.
No hablo de optimización, sino de simples pruebas. La prueba del mes dura 7 minutos.
Ayuda a "revivir" el indicador. Según los datos históricos funciona, pero no según los nuevos. No estoy seguro de qué hacer con él.
Prefiero que pongas la idea en palabras.
Y no es bueno hacer spam. Basta con hacer la pregunta en un lugar y no en muchos
El problema no está en el procesador, sino en el código del EA, en algún lugar hay cuellos de botella, pero no se puede diagnosticar y arreglar con palabras, se necesita el código
Aquí hay un trozo de código responsable de cada tic.
Perdón por los dos posts - no caben en uno.
¿Quizás puedas ver que la velocidad de puntuación del probador está disminuyendo?
Perdón por los dos posts - no caben en uno.
¿Tal vez pueda ver que la velocidad de puntuación del probador está disminuyendo?
Perdón por dos mensajes - no cabe en uno.
¿Quizás puedas ver que disminuye la velocidad de conteo en el probador?
Los gráficos son definitivamente más lentos.
Y no olvides que en mql4 hay un cálculo completo de las condiciones en if(), es decir, si tienes varios && entonces se calcularán y compararán todos los valores, aunque un false es suficiente para que la construcción con && sea falsa
es posible dividirlo en varios if()
en este caso, después de que el primer if() no se tenga en cuenta, no se considerará toda la construcción siguiente
de hecho este código sólo realiza 2 modificaciones de orden, todo lo demás es obviamente superfluo...
Nikolai, gracias. He eliminado todas las alertas y el manejo de errores. No hay un aumento visible de la velocidad. Sí, aquí se modifican las órdenes y se indica gráficamente el número de orden y el lugar de la condición de abierto. He dejado las funciones de texto ya que marcan en el gráfico qué orden se ha abierto (lo necesitamos para el análisis posterior).
hay que buscar otra forma de analizar, las funciones gráficas son muy lentas
Podrías meter todos los gráficos en una función separada y llamarla con una condición. Aunque pensé que al optimizar, las funciones gráficas y las alertas no funcionan, y no reducen la velocidad de la prueba.