[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 699

 
artmedia70:

У вас

void OpenBuy() {

double dStopLoss = 0, dTakeProfit = 0;
double Lots_New = Lot;

if (isLossLastPos(NULL, -1, MAGIC))
Lots_New *= 2;
else if (!isLossLastPos(NULL, -1, MAGIC))

Lots_New = Lot;

Является функцией и в самом начале этой функции вы присваиваете переменной Lots_New значение = Lot;

Подумайте как оно потом изменится, если всегда вы его будете приводить в исходное состояние?

Я вам где сказал это записать? Во внешних переменных перед функцией старт...

И нормализуйте значение лота под корректный размер:

Lots_New = NormalizeLot(Lot*2, False, "");




Огромное спасибо! 

Скажите еще пожалуйста, а можно ли прописать значение лота для каждого последующего убыточного ордера?  Чтобы было что-то в этом роде

1 лот 0.01

2 лот 0.01

3 лот 0.02

4 лот о.03

5 лот 0.07

.....

15 лот 1.2

 чтобы можно было менять значение лота в коде.

И чтобы в случае если сделка оказалась прибыльной все возвращалось к началу.

Заранее благодарен.

Борис. 

 
Necron:
Roger, спасибо, но неправильно работает все равно. Пробовал прикрутить другой трал, но ошибка все равно остается :( Отличается ли чем-нибудь трейлинг для одной позы и для нескольких одновременно?

Да в принципе, разницы нет.
Попробуй мою функцию, она достаточно простая, передавай в качестве параметров, меджик, и желаемый трал.
Вызов функции бросай в старт, в любом месте, лишь бы туда “сквозило” при каждом тике.

//+------------------------------------------------------------------+
void trailing(int magic, int trailing){
   int index = 0;
   while(trailing > 0 && OrdersTotal() != 0 && OrderSelect(index, SELECT_BY_POS)){
      if(OrderMagicNumber() == magic){
         if(OrderType() == OP_BUY){
            if(Bid - OrderStopLoss() > Point*trailing){
               if(trailing >= MarketInfo(Symbol(), MODE_STOPLEVEL) && trailing > MarketInfo(Symbol(), MODE_FREEZELEVEL))
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - (Point*trailing), OrderTakeProfit(), 0))Print(">>> ERROR ", GetLastError());
            }
            return;
         }
         if(OrderType() == OP_SELL){
            if(OrderStopLoss() - Ask > Point*trailing || OrderStopLoss() == 0){
               if(trailing >= MarketInfo(Symbol(), MODE_STOPLEVEL) && trailing > MarketInfo(Symbol(), MODE_FREEZELEVEL))
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + (Point*trailing), OrderTakeProfit(), 0))Print(">>> ERROR ", GetLastError());
            }
            return;
         }
      }
      index++;
   }
}
//+------------------------------------------------------------------+

Понятное дело, что меджики у ордеров должны быть разные.

 
Подскажите, пожалуйста, почему не срабатывает:

OrderSelect(1,SELECT_BY_POS,MODE_TRADES);

код ошибки 4051. Один открытый ордер OP_BUY есть.
Файлы:
ma_1.mq4  3 kb
 
itum:

Помогите решить проблему !


Я делаю поиск ордеров которые у меня открытие или отложение. Если они имеются то далее я определяю какой этот ордер бай или селл. При определенных условия (если одно больше другого, а также меньше третьего) то я хочу закрыть этот ордер. Изменить в нем параметры и открыть снова.

Проблема состоит в том - что что сигнал постоянно присутствует на закрытие ордера и его открытие. Поэтому у меня ордер закрывается у открывается снова, и так далее открывается и закрывается ... )))

Как решить эту проблему ? Га
По-моему Де жа вю... У меня одного??? Вам же уже несколько человек отвечали... Га?
Положите сюда свой код, в котором прописано условие на открытие и само открытие позы. Пальцем бум тыкать... :)
 
an11:
Подскажите, пожалуйста, почему не срабатывает:

OrderSelect(1,SELECT_BY_POS,MODE_TRADES);

код ошибки 4051. Один открытый ордер OP_BUY есть.

Cчет номеров в функции OrderSelect() начинается с нуля. А у вас 1, то есть вы ищете второй ордер, хотя в рынке у вас только один, поэтому и не работает. 

 
Vinin:
С параметрами так можно поступать, но с паттернами. Надо же вначале с критериями определиться. Похож, не похож. А если похож, то насколько. Хотя бы насколько (процентов). В одном случае временная составляющая, в другом ценовая. Как их соотнести друг с другом. Хотя можно нейронку присобачить. Слой Кохонена с этим хорошо справляется

не это был риторический вопрос, да действительно так и есть "похож не похож" на сколько процентов,.. у меня в одном из индикаторов, таких "похож не похож и на сколько процентов" ))) аж 12 штук пропасано вариантов одного паттерна, паттерн один а величины всегда разные и их соотношение )),... С нейро сетями еще не работал пока, думаю тут одного опыта писания элементарных алгоритмов по mql маловато будет, хотя по приминению, наверное он все бы это исправил. Я раньше с этой задачей справлялся по "варварски" заменяя Кохонена, записью в exсel всех параметров в момент наступления паттерна и результат если сделка открывалась,  потом методом анализа exсel  приходилось искать большее количество совпадений при соотношении с прибыльностью. ы итоге мало мальски чтото получалось, и паттерн система определяла вроде с умом, но все равно корявенько )
 
cyclik33: ...

Не знаю Борис, какой функцией вы пользуетесь, но в общем идея такова, так как шаг у вас не ровный, предлагаю использовать массив, в него записываете нужные вам объемы, а потом в функции перебираете его значение.

Пример на моем коде:

//+------------------------------------------------------------------+
double getMartinLot(double lot, double arrayLot[]){//ФУНКЦИЯ УПРАВЛЕНИЯ ОБъЕМОМ ТОРГОВ ПО СИСТЕМЕ МАРТИНГЕЙЛА
   static double balance_before, balance_after;    //ДЛЯ ХРАНЕНИЯ СОСТОЯНИЯ БАЛАНСА ДО И ПОСЛЕ СДЕЛОК
   static double save_Lot;   
   static int loop;
   if(loop == ArraySize(arrayLot))loop = 0;   
   balance_after = AccountBalance();               //СОХРАНЕНИЕ ТЕКУЩЕГО СОСТОЯНИЯ БАЛАНСА   
   if(balance_after >= balance_before){            //ПРОВЕРКА ИЗМЕНЕНИЯ БАЛАНСА
      save_Lot = lot;                              //ЕСЛИ ОН НЕ ИЗМЕНИЛСЯ ИЛИ СТАЛ БОЛЬШЕ, ТО СБРАСЫВАЕМ ЛОТ
      loop = 0;
   }else{
      save_Lot = arrayLot[loop];                   //ЕСЛИ СТАЛ МЕНЬШЕ ТО УВЕЛИЧИВАЕМ ЛОТ
      loop++;
   }
   balance_before = balance_after;                 //СОХРАНЯЕМ СОСТОЯНИЕ БАЛАНСА ПОСЛЕ РАБОТЫ
   return(save_Lot);
}
//+------------------------------------------------------------------+
 Пример вызова функции:
//+------------------------------------------------------------------+
int start()
  {
   double volume[] = {0.1, 0.1, 0.2, 0.3, 0.7};   //создаем массив с объемами

   if(OrdersTotal() == 0){
      OrderSend(Symbol(), OP_BUY, getMartinLot(0.1, volume), Ask, 10, Bid - 25*Point, Bid + 25*Point, "", 777);
   }
}
//+------------------------------------------------------------------+
 
artmedia70:
По-моему Де жа вю... У меня одного??? Вам же уже несколько человек отвечали... Га?
Положите сюда свой код, в котором прописано условие на открытие и само открытие позы. Пальцем бум тыкать... :)
У меня тоже :))) Валентин, почему-то не хочет показывать код, наверно не хочет засветить свои идеи...
 
ToLik_SRGV:

Не знаю Борис, какой функцией вы пользуетесь, но вообщем идея такова, так как шаг у вас не ровный, предлагаю использовать массив, в него записываете нужные вам объемы, а потом в функции перебираете его значение.

Пример на моем коде:

 Пример вызова функции:

Огромное Вам спасибо!!!!!

Кодом я тоже Вашим пользуюсь (и он кстати отлично работает),  но в другой советник хотел установить код Артемиды, во первых потому что с ним у меня было куда больше проблем и тут был уже вопрос принципа почему он не работал как надо.

Еще раз огромное Вам спасибо!!!! Буду пробовать! 

 

 

вопрос может банальный, советник торгует на М1, поступил сигнал на открытие ордера, предположим стоп короткий и ордер закрылся по сл. но условие на открытие все еще есть.

как лучше всего сделать, что бы в эту же минуту не открылся опять ордер? а например только на следующей? заранее спасибо!

Причина обращения: