Надо подправить код ..Кто соображает помогите.

 
// Торговые критерии

if ( L_1>L_2 )
{
Opn_B=true; // Критерий откр. Buy
Cls_S=true; // Критерий закр. Sell
}
if (L_1<L_2 )
{
Opn_S=true; // Критерий откр. Sell
Cls_B=true; // Критерий закр. Buy
}
//--------------------------------------------------------------- 6 --
// Закрытие ордеров
while(true) // Цикл закрытия орд.
{
if (Tip==0 && Cls_B==true) // Открыт ордер Buy..
{ //и есть критерий закр
Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");
RefreshRates(); // Обновление данных
Ans=OrderClose(Ticket,Lot,Bid,5); // Закрытие Buy
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Buy ",Ticket);
Cls_B=false; //
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==0) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}

if (Tip==1 && Cls_S==true) // Открыт ордер Sell..
{ // и есть критерий закр
Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа..");
RefreshRates(); // Обновление данных
Ans=OrderClose(Ticket,Lot,Ask,5); // Закрытие Sell
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Sell ",Ticket);
Cls_S=false; //
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==0) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
if(Cls_S==false || Cls_B==false) break; // Выход из while
}
//--------------------------------------------------------------- 7 --
// Стоимость ордеров
RefreshRates(); // Обновление данных
Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Миним. колич. лотов 
Free =AccountFreeMargin(); // Свободн средства
One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
Step =MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размера

if (Lots > 0) // Если заданы лоты,то 
Lts =Lots; // с ними и работаем 
else // % свободных средств
Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия

if(Lts < Min_Lot) Lts=Min_Lot; // Не меньше минимальн
if (Lts*One_Lot > Free) // Лот дороже свободн.
{
Alert(" Не хватает денег на ", Lts," лотов");
return; // Выход из start()
}
//--------------------------------------------------------------- 8 --
// Открытие ордеров
while(true) // Цикл закрытия орд.
{
if (Total==0 && Opn_B==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данных
SL=Bid - New_Stop(StopLoss)*Point; // Вычисление SL откр.
TP=Bid + New_Stop(TakeProfit)*Point; // Вычисление TP откр.
Alert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy

if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
if (Total==0 && Opn_S==true) // Открытых орд. нет +
{ // критерий откр. Sell
RefreshRates(); // Обновление данных
SL=Ask + New_Stop(StopLoss)*Point; // Вычисление SL откр.
TP=Ask - New_Stop(TakeProfit)*Point; // Вычисление TP откр.
Alert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Открытие Sel
if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Sell ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
break; // Выход из while
}
//--------------------------------------------------------------- 9 --
return; // Выход из start()
}
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error) // Ф-ия обработ ошибок
{
switch(Error)
{ // Преодолимые ошибки 
case 4: Alert("Торговый сервер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решение
return(1); // Выход из функции
case 135:Alert("Цена изменилась. Пробуем ещё раз..");
RefreshRates(); // Обновим данные
return(1); // Выход из функции
case 136:Alert("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тика
Sleep(1); // Задержка в цикле
return(1); // Выход из функции
case 137:Alert("Брокер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решение
return(1); // Выход из функции
case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
Sleep(500); // Простое решение
return(1); // Выход из функции
// Критические ошибки
case 2: Alert("Общая ошибка.");
return(0); // Выход из функции
case 5: Alert("Старая версия терминала.");
Work=false; // Больше не работать
return(0); // Выход из функции
case 64: Alert("Счет заблокирован.");
Work=false; // Больше не работать
return(0); // Выход из функции
case 133:Alert("Торговля запрещена.");
return(0); // Выход из функции
case 134:Alert("Недостаточно денег для совершения операции.");
return(0); // Выход из функции
default: Alert("Возникла ошибка ",Error); // Другие варианты 
return(0); // Выход из функции
}
}
//-------------------------------------------------------------- 11 --
int New_Stop(int Parametr) // Проверка стоп-прик.
{
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
if (Parametr<Min_Dist) // Если меньше допуст.
{
Parametr=Min_Dist; // Установим допуст.
Alert("Увеличена дистанция стоп-приказа.");
}
return(Parametr); // Возврат значения
}

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

выкладываю код если кто может чтото подсказать помогите..Заранее благодарен.

 

В ваш код я не вникал. Так, навскидку глянул. Возможно, вам поможет

 https://www.mql5.com/ru/forum/107476/page20

Функция GetTypeLastClosePos().

Эта функция возвращает тип последней закрытой позиции или -1. Более точный отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тип последней закрытой позиции или -1               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastClosePos(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;f (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            r=OrderType();
          }}}}} return(r); }
 Вставляете эту функцию в советник.

А потом в условия открытия позиций вставляете дополнительное условие. 

Например, для открытия позиции селл :

//------------------------------------------------------------------------------  

//  открываем  позицию селл только тогда, 

//если последняя закрытая советником позиция была бай-сделкой -  

if ( GetTypeLastClosePos(NULL, magic) ==-1 || GetTypeLastClosePos(NULL, magic) ==OP_BUY ) 

 { 

 //-----------------------

Не забудьте предусмотреть (добавить) magic в функции Ордерсенд открытия позиций. Иначе в онлайне советник может "заклинить".

 

Программист составляет алгоритм перед тем как набирать программный код. Если Вы не видите, чтоб программист составил алгоритм, это ещё не значит, что алгоритма у него нет. В простых случаях у программиста алгоритм лежит в голове, а не на бумаге. Кодить без алгоритма - значит не представлять себе как должна работать программа. Это всё равно что пытаться соорудить машуну "чтоб ездила" и при этом не представлять себе как она должна работать. 

 1. Проверяем наличие сигнала к открытию Бай-ордера. Если сигнал есть, то перейти к шагу 30.

 20. Проверяем наличие сигнала к открытию Селл-ордера. Если сигнал есть, то перейти к шагу 50.

30. Проверяем сегодняшние Бай-ордера нашего советника. Если рыночные  Бай-ордера есть, или время закрытия последнего Бай-ордера больше или равно времени открытия нулевой свечи, то обнуляем сигнал открытия бай-ордера. В противном случае перейти к шагу № 40.

40. Открыть Бай-ордер.

50. Проверяем сегодняшние Селл-ордера нашего советника. Если рыночные Селл-ордероа есть или время закрытия последнего ордера больше или равно времени открытия нулевой свечи, то обнуляем сигнал открытия Селл-ордера. В противном случае перейти к шагу № 60.

60. Открыть Селл-ордер. 

 

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

Любая программа состоит из трёх частей: даные, поступающие на вход программы, обработка этих данных и данные, которые выдаёт программа в результате этой обработки. 

 
После открытия позиции сразу запретите открытие в том же направлении и разрешите открытие в противоположном(например,Opn_S = false; Opn_B=true;) Дополнительное условие на открытие - Ваш индикатор
 
kaas2968 >>:

 

Экономьте время, своё и чужое. Пишите аккуратнее,  такой код читать трудно. Да и сами потом как будете разбираться.
 

Простое решение. Позиции открываются только, если количество уже открытых одноименных позиций меньше, чем MaxPosNumber, задаваемое пользователем.

extern int MaxPosNumber=1;//максимальное количество открытых позиций одного направления

//-----------старт
  if(NumberOfPositions(Symbol(), OP_BUY,  Magic)< MaxPosNumber) {разрешено открытие buy };
  if(NumberOfPositions(Symbol(), OP_SELL, Magic)< MaxPosNumber) {разрешено открытие sell};

//-----------используемые пользовательские функции
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
 
granit77 писал(а) >>

Простое решение. Позиции открываются только, если количество уже открытых одноименных позиций меньше, чем MaxPosNumber, задаваемое пользователем.


спасибо за ответ .Но в строчке
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {

выдаёт ошибку '(' - function definition unexpected
после int NumberOfPositions (

как можно исправить? заранее спасибо.

 
kaas2968 >>:

спасибо за ответ .Но в строчке

выдаёт ошибку '(' - function definition unexpected
после int NumberOfPositions (

как можно исправить? заранее спасибо.

Исправлять ничего не надо. Код, который находится в моем посте после строки: "//-----------используемые пользовательские функции", это тело функции, которое должно быть расположено вне функции start, например, в самом конце эксперта. Видимо, Вы ее поместили внутри.

 
Всем день добрый ... вот код обычного Трейлинг стопа ... 

MQL-Код:
int Tral( int Ticket)
{double TralPrice,Punkt;
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES );
if (OrderType()==0){PunktBid-OrderOpenPrice())/Point;TralPrice=NormalizeDouble((Bid-TS*D*Point),Digits);}
if (OrderType()==1){PunktOrderOpenPrice()-Ask)/Point;TralPrice=NormalizeDouble((Ask+TS*D*Point),D igits);}
if (Punkt<MarketInfo(Symbol(),MODE_STOPLEVEL))return( 0);
if (Punkt<TS*D)return(0);
if (OrderType()==0 && TralPrice<=NormalizeDouble(OrderStopLoss(),Digits) ) return(0);
if (OrderType()==1 && TralPrice>=NormalizeDouble(OrderStopLoss(),Digits) && OrderStopLoss()!=0)return(0);
ModifyOrder(OrderTicket(),OrderOpenPrice(),TralPri ce,OrderTakeProfit());
return(0);
}
... как подстроить так, что бы всё время тралился только первый открытый (с тикетом "0")из сетки ордеров Sell или Buy ... ... заранее благодарю за подсказку.
 
bablusut:
Всем день добрый ... вот код обычного Трейлинг стопа ... 

MQL-Код:
int Tral( int Ticket)
{double TralPrice,Punkt;
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES );
if (OrderType()==0){PunktBid-OrderOpenPrice())/Point;TralPrice=NormalizeDouble((Bid-TS*D*Point),Digits);}
if (OrderType()==1){PunktOrderOpenPrice()-Ask)/Point;TralPrice=NormalizeDouble((Ask+TS*D*Point),D igits);}
if (Punkt<MarketInfo(Symbol(),MODE_STOPLEVEL))return( 0);
if (Punkt<TS*D)return(0);
if (OrderType()==0 && TralPrice<=NormalizeDouble(OrderStopLoss(),Digits) ) return(0);
if (OrderType()==1 && TralPrice>=NormalizeDouble(OrderStopLoss(),Digits) && OrderStopLoss()!=0)return(0);
ModifyOrder(OrderTicket(),OrderOpenPrice(),TralPri ce,OrderTakeProfit());
return(0);
}
... как подстроить так, что бы всё время тралился только первый открытый (с тикетом "0")из сетки ордеров Sell или Buy ... ... заранее благодарю за подсказку.

Тикет ноль не бывает.

Рекомендую первый ордер в сетке открыть с каким либо комментарием, по которому и находим нужный ордер и начинаем делать с ним всё что угодно

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