Некорректно мучить терминал и советник из за кривого индикатора. Правильнее рихтовать кривой индикатор.Добрый день.
Есть индикатор, который в режиме реального времени отрисовывается не совсем корректно, но при обновлении графика или при переключение туда=сюда таймфреймов он рисуется как надо.
Я пробовал функции ChartRedraw, WindowRedraw и переключение периодов ChartSetSymbolPeriod. Первые две вообще не работают(не перерисовывают индикатор)
ChartSetSymbolPeriod работает, но при установке вместе с советником при каждом обновлении терминал зависает секунд на 20-30 и при этом удаляет кнопки которые рисует советник(управление покупкой\продажей).
Как заставить перерисовываться индикатор и при этом сохранить работу советника?
Понимаю. И все же как можно перерисовать индикатор?Некорректно мучить терминал и советник из за кривого индикатора. Правильнее рихтовать кривой индикатор.
Бросается в глаза дурной тон все переменные делать глобальными. Из за этой привычки будет много косяков.
Допустим ордер Buy и MarketInfo(_Symbol,MODE_SWAPLONG) < 0, что должна возвращать функция и от куда это значение берётся?
Допустим Sell MarketInfo(_Symbol,MODE_SWAPSHORT) < 0, что должна возвращать функция и от куда это берётся?
А это ещё зачем Lot=Lot; ? Зачем переменной присваивать её же значение?
double fl(double Tlot, int M, double Flot)//Лот по арифметической прогрессии прогрессии
{
for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начало перебора ордеров
{
if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==M && OrderSymbol()==_Symbol)//Выбираем ордер
{
//*********************************************************************************************
Tlot = OrderLots();//Текущий лот
if(OrderProfit()+OrderCommission()+OrderSwap()<0)//Нужное условие
Flot = Tlot-0.01;//Новый лот уменьшение
else if(OrderProfit()+OrderCommission()+OrderSwap()>0)//Нужное условие
Flot = Tlot+0.01;//Новый лот
//*********************************************************************************************
}
}
return(Flot);//Финальный лот
}
А еслиКод:double fl(double Tlot, int M, double Flot)//Лот по арифметической прогрессии прогрессии { for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начало перебора ордеров { if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==M && OrderSymbol()==_Symbol)//Выбираем ордер { //********************************************************************************************* Tlot = OrderLots();//Текущий лот if(OrderProfit()+OrderCommission()+OrderSwap()<0)//Нужное условие Flot = Tlot-0.01;//Новый лот уменьшение else if(OrderProfit()+OrderCommission()+OrderSwap()>0)//Нужное условие Flot = Tlot+0.01;//Новый лот //********************************************************************************************* } } return(Flot);//Финальный лот }
Как такой способ реализации?
А если
OrderProfit()+OrderCommission()+OrderSwap() окажется = 0, каким будет значение Flot ?
Если оно не назначено вне функции, будет ошибка. Так как в функции в этой ситуации значение не присваивается.
else if(OrderProfit()+OrderCommission()+OrderSwap()==0)//Нужное условие
Flot = 0.01;//Новый лот
void OnTick()
{
sw();
}
//----------------------------------------------------------------------------------------
int sw(int P)
{
//*************************************************************************
switch(TORGISW)
{
case 0:
if(MarketInfo(Symbol(),MODE_SWAPLONG)>0 && MarketInfo(Symbol(),MODE_SWAPSHORT)<0)
P=0;
break;
case 1:
if(MarketInfo(Symbol(),MODE_SWAPLONG)<0 && MarketInfo(Symbol(),MODE_SWAPSHORT)>0)
P=1;
break;
case 2:
if(MarketInfo(Symbol(),MODE_SWAPLONG)<0 && MarketInfo(Symbol(),MODE_SWAPSHORT)<0)
P=2;
else
if(MarketInfo(Symbol(),MODE_SWAPLONG)>0 && MarketInfo(Symbol(),MODE_SWAPSHORT)>0)
P=2;
break;
}
//*************************************************************************
return(P);
}
Напиши такКод:void OnTick() { sw(); } //---------------------------------------------------------------------------------------- int sw(int P) { //************************************************************************* switch(TORGISW) { case 0: if(MarketInfo(Symbol(),MODE_SWAPLONG)>0 && MarketInfo(Symbol(),MODE_SWAPSHORT)<0) P=0; break; case 1: if(MarketInfo(Symbol(),MODE_SWAPLONG)<0 && MarketInfo(Symbol(),MODE_SWAPSHORT)>0) P=1; break; case 2: if(MarketInfo(Symbol(),MODE_SWAPLONG)<0 && MarketInfo(Symbol(),MODE_SWAPSHORT)<0) P=2; else if(MarketInfo(Symbol(),MODE_SWAPLONG)>0 && MarketInfo(Symbol(),MODE_SWAPSHORT)>0) P=2; break; } //************************************************************************* return(P); }
Почему выдает :
'sw' - wrong parameters count
int sw(int P = 0)
sw(0);
почему так? ведь там значение может быть 2 или 1? к примеру в AUDCAD должен выдать 1Напиши так
или такКод:int sw(int P = 0)
Код:sw(0);
1. Функция это код который требует для выполнения работу процессора. Обращение к переменной гораздо быстрее.Так сделаюКод:else if(OrderProfit()+OrderCommission()+OrderSwap()==0)//Нужное условие Flot = 0.01;//Новый лот
double Profit=OrderProfit()+OrderCommission()+OrderSwap();
if(Profit>0,00001)Flot = Tlot+0.01;
else if(Profit< -0,00001)Flot = Tlot-0.01;
else Flot = 0.01;
ВСЁ НЕ ПРАВИЛЬНО )).Код:double fl(double Tlot, int M, double Flot)//Лот по арифметической прогрессии прогрессии { for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начало перебора ордеров { if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==M && OrderSymbol()==_Symbol)//Выбираем ордер { //********************************************************************************************* Tlot = OrderLots();//Текущий лот if(OrderProfit()+OrderCommission()+OrderSwap()<0)//Нужное условие Flot = Tlot-0.01;//Новый лот уменьшение else if(OrderProfit()+OrderCommission()+OrderSwap()>0)//Нужное условие Flot = Tlot+0.01;//Новый лот //********************************************************************************************* } } return(Flot);//Финальный лот }
Как такой способ реализации?
1) Затем чтобы если прошлая сделка с прибылью то новый лот увеличенный.ВСЁ НЕ ПРАВИЛЬНО )).
Зачем перебирать все ордера в истории, чтобы на выходе получить НОВЫЙ ЛОТ ). Зачем в функцию передавать параметры Tlot и Flot ??? Нет, это так всё не работает, мой совет читать ХЕЛП по MQL4 прям прям с самой первой строчки самого первого раздела, там вкратце написано более менее всё понятно. ))) Разобраться в том как всё работает для начала, потом уже писать и спрашивать, так не так... НУ тип того ).
1) Затем чтобы если прошлая сделка с прибылью то новый лот увеличенный.
2) Я пробовал глобально объявлять но мне сказали это правило дурного тона.
3) Ну подскажи как это работает или приведи пример кода на основе идеи.
4) У меня есть рабочие варианты ,которые работают ,но мне сказали так не правильно писать и код будет тормозить.
double lot(string symbol, int magic, double lotAdds)
{
double result = 0;
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if ((OrderMagicNumber() == magic) && (OrderSymbol() == symbol) && (OrderLots() != 0))
{
result = (OrderProfit() + OrderCommission() + OrderSwap() > 0) ? OrderLots() + lotAdds : OrderLots() - lotAdds;
break;
}
}
else
Print("Ошибка : ", GetLastError());
}
return(NormalizeDouble(result, 2));
}
Всмысле свой?Ну перебирать чтобы найти СВОЙ, ладно это я понял ). Ну примерно так вот.
Код:double lot(string symbol, int magic, double lotAdds) { double result = 0; for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if ((OrderMagicNumber() == magic) && (OrderSymbol() == symbol) && (OrderLots() != 0)) { result = (OrderProfit() + OrderCommission() + OrderSwap() > 0) ? OrderLots() + lotAdds : OrderLots() - lotAdds; break; } } else Print("Ошибка : ", GetLastError()); } return(NormalizeDouble(result, 2)); }
Всмысле свой?
Вот этопочему так? ведь там значение может быть 2 или 1? к примеру в AUDCAD должен выдать 1
int sw(int P)
Ну можно так написать ), делов то. Как хошь так и пиши, только правильно ). Примерно так вот ))).Со своим мейджиком со своего инструмента. А OrderLots() = 0 вообще не может быть, эт вы меня тут запутали )))). Это чисто для примера... )
double lot(string symbol, int magic, double lotAdds)
{
double result = 0;
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if ((OrderMagicNumber() == magic) && (OrderSymbol() == symbol))
{
double profit = OrderProfit() + OrderCommission() + OrderSwap();
if (profit != 0)
{
result = (profit > 0) ? OrderLots() + lotAdds : OrderLots() - lotAdds;
break;
}
}
}
else
Print("Ошибка : ", GetLastError());
}
return(NormalizeDouble(result, 2));
}