например строка
bool neutral = OrderClosePrice() == OrderOpenPrice();
наверное надо сформировать работу алгоритмических условий так:
bool neutral=false;
if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;
ну и остальные два условия в том же духе
Кстати, последняя сделка в истории - не всегда последняя по времени.
например строка
наверное надо сформировать работу алгоритмических условий так:
bool neutral=false;
if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;
ну и остальные два условия в том же духе
но все равно, конечно проверю и перепишу. Сообщу итоги.
Да я убрала выборку по времени, но все равно не работает пока... Я просто ранее данный блок использовала в других системах и он в этой части работал идеально.
но все равно, конечно проверю и перепишу. Сообщу итоги.
эти переменные где то обнулены?
ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса Minus++; //Подсчет отрицательных сделок Sdelok++; //Подсчет количества сделок
Может быть пойти от отобратного.
Я уберу пока сбор статистики из этой функции, а общий минус и статистику в другой (отдельной функции буду производить)
Пишу по блокам
Блок сбора статситики и подсчета минуса и плюса (минус и плюс глобальные переменные)
if(OrderSelect((OrdersHistoryTotal() - 1), SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol) { if(OrderTicket() != Tiket2) { bool profit1 = false; if(OrderClosePrice() > 0) { profit1 = true; } bool loss1 = false; if(OrderClosePrice() < 0) { loss1 = true; } SumPosOrder = OrderLots(); Tiket2 = OrderTicket(); Print(OrderCloseTime()); if(loss1) { ObchMin = ObchMin + SumPosOrder; Minus++; Sdelok++; } if(profit1) { ObchPlus = ObchPlus + (SumPosOrder * 0.8); } if(profit1 && ObchPlus < ObchMin) { Pobeda++; Sdelok++; } if(profit1 && ObchPlus > ObchMin) { ObchPlus = 0; ObchMin = 0; Pobeda++; Sdelok++; } }
Блок 2 выбор переменной n для расчета (точнее выборки) ставки
int GetN() { int n = 0; for(int i = OrdersHistoryTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol) { bool profit = false; if(OrderClosePrice() > 0) profit = true; bool loss = false; if(OrderClosePrice() < 0) loss = true; } if(loss) { n++; } if(n >= MartinSteps) { n = 0; break; } if(profit && ObchPlus < ObchMin) { n++; } if(profit && ObchPlus > ObchMin) { n = 0; break; } } Print(n); return n; } double SelectVolume(int n) { return n == 0 ? Volume1 : n == 1 ? Volume2 : n == 2 ? Volume3 : n == 3 ? Volume4 : n == 4 ? Volume5 : n == 5 ? Volume6 : n == 6 ? Volume7 : n == 7 ? Volume8 : n == 8 ? Volume9 : n == 9 ? Volume10 : Volume1; } //+------------------------------------------------------------------+
Так наверное будет верно...
пока не пойму логики
как так?
bool profit = false; if(OrderClosePrice() > 0) profit = true; bool loss = false; if(OrderClosePrice() < 0) loss = true;
как цена закрытия ордера может быть меньше нуля?
ордер BUY будет в плюсе, если цена закрытия больше цены открытия
вот условие плюса по покупке (без учета комиссий и свопа):
OrderClosePrice() > OrderOpenPrice()если наоборот, то это минус
пока не пойму логики
как так?
как цена закрытия ордера может быть меньше нуля?
ордер BUY будет в плюсе, если цена закрытия больше цены открытия
вот условие плюса по покупке (без учета комиссий и свопа):
если наоборот, то это минусТак как я пишу для бинарных опционов я сделала чуть иначе:
if(OrderProfit() > 0)
Так наверное будет верно?
Может быть пойти от отобратного.
Я уберу пока сбор статистики из этой функции, а общий минус и статистику в другой (отдельной функции буду производить)
Пишу по блокам
Блок сбора статситики и подсчета минуса и плюса (минус и плюс глобальные переменные)
Блок 2 выбор переменной n для расчета (точнее выборки) ставки
Так наверное будет верно...
По всему алгоритму вам уже надавали советов, я не хочу встревать и даже не смотрел ваш код и так-же советы… А вот это
double SelectVolume(int n) { return n == 0 ? Volume1 : n == 1 ? Volume2 : n == 2 ? Volume3 : n == 3 ? Volume4 : n == 4 ? Volume5 : n == 5 ? Volume6 : n == 6 ? Volume7 : n == 7 ? Volume8 : n == 8 ? Volume9 : n == 9 ? Volume10 : Volume1; }
бросилось в глаза. В связи с этим вопрос: разве не проще и более читабельно применить оператор-переключатель switch
double SelectVolume(int n) { double Volume = 0.0; switch(n) { case 1 : Volume = Volume2; break; case 2 : Volume = Volume3; break; case 3 : Volume = Volume4; break; case 4 : Volume = Volume5; break; case 5 : Volume = Volume6; break; case 6 : Volume = Volume7; break; case 7 : Volume = Volume8; break; case 8 : Volume = Volume9; break; case 9 : Volume = Volume10; break; default : Volume = Volume1; break; } return(Volume); }Мне кажется так читается и понимается легче. Возможно и работает чуток побыстрей.
По всему алгоритму вам уже надавали советов, я не хочу встревать и даже не смотрел ваш код и так-же советы… А вот это
бросилось в глаза. В связи с этим вопрос: разве не проще и более читабельно применить оператор-переключатель switch
Мне кажется так читается и понимается легче. Возможно и работает чуток побыстрей.Я изначально сделала так как я нашла, оно работало, вот и не задумывалась над улучшением.
Знаете как говорят - Работает - не трогай.
Но теперь я конечно попробую применить данный метод. Так как необходимо учиться и развиваться.
Вот только сейчас со своей переменной n разберусь. Никак она не хочет считаться.
всегда n = 0 (пока)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пишу код
Задача такая была изначально:
Найти последний закрытый ордер.
Проверить плюсом он закрылся или минусом.
Посчитать количество сделок
Посчитать количество плюсовых и минусовых.
Рассчитать сумму ставки.
Если сделка плюсовая, (а общий минус = 0) тогда ставка № 1
Если сделка минусовая, тогда считаем минус и ставка № 2
Если плюс, но минус > 0 тогда следующая ставка.
Но почему-то не верно считает количество ставок и сумму ставки...