Советник открывает лишние сделки. - страница 2

 
tara:
Ни сегодня, ни завтра ничего не кину.
Благодарю за честность))
 
LRA:

Открыл Яндекс, набрал в строке поиска c++ флаги и вот ссылка. Правда, сначала прикол - но ниже все путем.

Ты на Форексе недавно, а я крутой программист - открою секрет. Никакого форекса нет. Ну вообще-то он может и есть, но никто на нем не торгует. Ну вообще-то может кто и торгует, но прибыли никто не получает. Доказательства в самой первой теме на этой странице и в других подобных. Хотя чисто теоретически - возможности безграничные. Посмотри мой демо-счет. Сервер MetaQuotes-Demo   счет 8872470   пароль user2   и  счет  8898802 пароль user3  Как туда попасть? Файл --> открыть счет. В нижней строке, где написано введите имя брокера..., пишем MetaQuotes и Enter. Если хочешь подробнее (программирование, Форекс, советники) - дай свою почту. Для конспирации создай новую.

Открыл Яндекс, набрал в строке поиска c флаги вот еще ссылка.

Открыл Яндекс, набрал в строке поиска Программирование флаги вот еще ссылка.


Я знаю что такое флаг и зачем он используется. Ладно буду дальше маяться, видать толку нету у меня объяснить!!! На счёт не опытности на форексе это вы с чего взяли?
 
LRA:
Простите, что обидел. Почту видел - но не записал. Исправить так:

Спасибо буду пробовать, только с работы пришел))) Как что получиться отпишусь.

Вот что получилось, ниже ещё скрины прикреплю, проблема осталась.


Синим подчеркнул, те сделки от которых не могу избавиться (лишние)

// В глобальных переменных сверху

bool   StopStart=false;
int    Number1=0,Number2; // Для удобства анализа истории счета

// Открываем первый ордер на продажу    
   
    
    if(CountTradesSell()==0) // Если количество ордеров ==0, открываем первую сделку 
     {
     
     StopStart=true; 
    Number1=Number1+1;
    Number2=0;
      
      ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,comment+string(Number1),Magic,0,Red);
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
        {
         TPSell=NormalizeDouble(Bid-TakeProfit*Point,Digits);
         OrderModifySell=OrderModify(ticket,OrderOpenPrice(),0,TPSell,0);    
        }
     }
               
      if(CountTradesSell()>=1)//Если количество ордеров >= 1, то окрываем второй и последующие ордера
        {
            if(isCloseLastPosSellTake()== True) // Если цена достигла ТР
           {
            StopStart=false;
            ClosePosFirstProfitSell(); //Закрываем все сделки
             
           }   
           else     
            
         if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS))
         if(OrderMagicNumber() == Magic && OrderSymbol() ==Symbol())
         if(OrderType() == OP_SELL)
         if(StopStart==true) // Проверка флага
         if( Bid>=NormalizeDouble(OrderOpenPrice()+Step*Point,Digits)) //Сравниваем цену открытия ордера и цену на Step пунктов ниже.
            {  
               Number2=Number2+1;
               // Выставляем новый ордер
               ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,comment+string(Number1)+"-"+string(Number2),Magic,0,Red);// Выставляем новый ордер
               int t;                                     // Перебираем все ордера от первого до последнего
               for(t=0; t<OrdersTotal(); t++)
               if(OrderSelect(t, SELECT_BY_POS))
               if(OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
               if(OrderType() == OP_SELL)
               {
                 SumOrderOpenPrice=SumOrderOpenPrice + OrderOpenPrice();// Получаем сумму цен открытия всех ордеров
                } 
                 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))//Выбираем последний открытый ордер
                  { 
                    SredTPSell=SumOrderOpenPrice/CountTradesSell()-NormalizeDouble(PlusTP*Point,Digits);// Цены открытия всех ордеров делим на количество всех ордеров
                    OrderModifyBuy=OrderModify(ticket,OrderOpenPrice(),0,SredTPSell,0);// Модифицируем последний открытый ордер, ставим TakeProfit
                  }
              }
           }
          
  }


 
LRA:

насчет проверки закрытия ордеров ссылка учебник можно скачать или взять в формате CHM из прикрепленного файла

В журнале все время повторяется ошибка Error order close 4108 - это значит, что ордер уже закрыт. Нужно убрать цикл повторения закрытия.

А для реала нужно сделать закрытие с проверкой как в учебнике. Если

 не помогло, надо искать в другом месте. А почему кириллицей (по русски) не понравилось?

Нужно на время поиска сделать Number2=1; и при открытии первого ордера лот = 0,1  а для следующих 0,1*Number2. Тогда лоты будут 0,1  0,2  0,3  0,4  ...

У меня возникло подозрение, что это повторно открывается первый ордер и по лоту это будет видно.


Кириллицу не использую, так сразу себя приучил, а разве вообще программа от компилируется с кириллицей?

Может тогда сделать цикл закрытия такой, пока не закроется ордер дальше не двигаться:

while (!OrderClose(OrderTicket(),...

C переменной Number попробую.

Да мне тоже так кажется, я уже делал задержку по времени после закрытия ждать программе например 3 минуты, всё вроде работает сделки закрывает потом ждёт 3 минуты и всё равно 1 раз открывает лишнюю сделку, а потом работает нормально и так после каждого закрытия происходит.

По ссылке скачал справку, распаковал, открыл но там пусто!!!

 

Возможно ли в функции приведённой ниже вернуть значение False в начале функции и после окончания функции True (то есть после закрытия сделок)

//+---------------------------Закрытие Ордеров на Sell--------------------------+
bool ClosePosSellSelect()
  {
   
   int    it,Error;
   if(OrderType()==OP_SELL)
   {
      for(it=OrdersTotal()-1; it<=NumberOfTry; it--)
        if(OrderSelect(it,SELECT_BY_POS,MODE_TRADES))
        if(OrderMagicNumber() == Magic && OrderSymbol() ==Symbol())
        if(OrderClose(OrderTicket(),OrderLots(),Ask,30,Red)) break;
        else
         {
            Error = GetLastError();
            Print("Ошибка закрытия ордера = ", Error);
            Sleep(400);
         }      
     }
  }
 
MasterMihalich:

Возможно ли в функции приведённой ниже вернуть значение False в началефункции и после окончания функции True (то есть после закрытия сделок)

Во всех типах функций, кроме войд, обязательно нужно возвращать что-то, а уж в каком месте это делать - дело программиста. Но возврат возможен только один, после return функция завершает работу.

Можно присваивать значения глобальным переменным, если надо более одного раза что-то из функции вытягивать.

А в вашем случае, присваиваем глобальной переменной фалс, потом вызываем функцию, а в ней прописываем в конце возврат тру:

 

 

bool clo=false;
clo=ClosePosSellSelect();
bool ClosePosSellSelect()
  {
   
   int    it,Error;
   if(OrderType()==OP_SELL)
   {
      for(it=OrdersTotal()-1; it<=NumberOfTry; it--)
        if(OrderSelect(it,SELECT_BY_POS,MODE_TRADES))
        if(OrderMagicNumber() == Magic && OrderSymbol() ==Symbol())
        if(OrderClose(OrderTicket(),OrderLots(),Ask,30,Red)) break;
        else
         {
            Error = GetLastError();
            Print("Ошибка закрытия ордера = ", Error);
            Sleep(400);          
         }      
   }
  return(true);  
  }
 
MasterMihalich:

Возможно ли в функции приведённой ниже вернуть значение False в началефункции и после окончания функции True (то есть после закрытия сделок)

Странная функция.

Допустим что открыто 5 сделок по разным инструментам.

А NumberOfTry=3. Вопрос - будет ли закрыта нужная сделка?

Второй вопрос - советник открыл 2 сделки. Будет ли закрыта вторая сделка. 

 
evillive:

Во всех типах функций, кроме войд, обязательно нужно возвращать что-то, а уж в каком месте это делать - дело программиста. Но возврат возможен только один, после return функция завершает работу.

Можно присваивать значения глобальным переменным, если надо более одного раза что-то из функции вытягивать.

А в вашем случае, присваиваем глобальной переменной фалс, потом вызываем функцию, а в ней прописываем в конце возврат тру:

 

 

Спасибо за подсказку, но чего то не выходит всё пытаюсь остановить выполнения советника, когда функция начинает закрывать ордера, а после того как она закончит, возобновить работу.

А на данный момент получается в начале когда проверяя значение функции, я её вызываю она начинает работать и закрывает всё подряд)))

 
	          
 
Vinin:

Странная функция.

Допустим что открыто 5 сделок по разным инструментам.

А NumberOfTry=3. Вопрос - будет ли закрыта нужная сделка?

Второй вопрос - советник открыл 2 сделки. Будет ли закрыта вторая сделка. 

 

Согласен, функция странная, но пока сижу с другим, всё поправлю, позже!
 

Артем Mihalich! На письма ты почему-то перестал отвечать. Пишу сюда...

На ПАММ-счете советник одну позицию открыл без ТП. Сбой или руками открыли? Так как другие советники на графике отсутствуют, надо исключить использование Magic. Тогда он ее учтет и поставит ТП

Сейчас обдумываю еще одну идею увеличить прибыльность

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