[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 377

 

Добрый вечер. Помогите пожалуйста с советником, для наглядности всё постарался изобразить на рисунке. Допустим образовался ''Додж'' я когда цена СЛЕДУЮЩЕГО бара выше максимума "Доджа" - покупаю, Т/Р допустим 15 пунктов я взял, а цена на этом же баре так и идёт в верх и ордер (Buy_2) с Т/Р 15 пунктов открывается опять, а мне это 2е открытие (Buy_2) на 1м баре после "Доджа" не надо. Как убрать это недоразумение ???

 
iMAG:

Уважаемые профи и просто знающие!

Я в прострации - индикатор ББ даёт непонятные мне сигналы (не "Красный-зелёный-красный"!). А точнее, задаю такой вызов:

bolup = iBands(Symbol(), 0, 24, 0, 2, 0, 1, 1);
boldn = iBands(Symbol(), 0, 24, 0, 2, 0, 2, 1);
bolmd = (bolup + boldn) / 2;
Print("Bands upper = ", bolup);
Print("Bands lower = ", boldn);
Print("Bands media = ", bolmd);

В результате все 3 переменные дают одно и то же значение. >8-O

Пара евра, ТФ - Н1. Есть идеи???

Спасибо заранее...

Вы бы девиацию еще отрицательной задали?
 
Fantar:

для наглядности всё постарался изобразить на рисунке

Теперь попробуйте изобразить тоже самое, только на mq4. Здесь ветка для вопросов, если что непонятно. А для создания советников с нуля есть сервис Работа
 
iMAG:

Уважаемые профи и просто знающие!

Я в прострации - индикатор ББ даёт непонятные мне сигналы (не "Красный-зелёный-красный"!). А точнее, задаю такой вызов:

bolup = iBands(Symbol(), 0, 24, 0, 2, 0, 1, 1);
boldn = iBands(Symbol(), 0, 24, 0, 2, 0, 2, 1);
bolmd = (bolup + boldn) / 2;
Print("Bands upper = ", bolup);
Print("Bands lower = ", boldn);
Print("Bands media = ", bolmd);

В результате все 3 переменные дают одно и то же значение. >8-O

Пара евра, ТФ - Н1. Есть идеи???

Спасибо заранее...

Отклонение от основной линии вы поставили 0 (ноль). Надо больше ноля.
 

Суть стратегии: Вход по сигралу стохастика(5,14,3) выход тоже по стохастику только с другим периодом (5,3,3). Вот я не пойму как можно зделать выход по стохастику, а не по обратному сигнагалу?
У меня появилась проблема и я не представляю как ее можно решить постараюсь объяснить.
Значит в коде есть, который я выложил, есть 2 функции
//+------------------------------------------------------------------+
//| подготовить массив тикетов для закрытия |
//+------------------------------------------------------------------+
void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9])
{
int size=ArrayRange(arrayTickets,0);
//----
if (size==0) return;

int i,type,ticket,closeSize;
for (i=0;i<size;i++)
{
type=arrayTickets[i][1];
// если тип ордера не рыночный, то пропускаем
if (type>OP_SELL) continue;

if (Revers) // перевернем тип рыночного ордера
{
if (type==OP_BUY) type=OP_SELL; else type=OP_BUY;
}

// тут решаем для каждого открытого ордера его судьбу
// оставить в рынке или добавить в массив на закрытие
if (type==OP_BUY)
{
//
// код разрешающий оставить покупку

// как пример
if (signal==OP_BUY) continue;
}

if (type==OP_SELL)
{
//
// код разрешающий оставить продажу

// как пример
if (signal==OP_SELL) continue;
}

closeSize=ArrayRange(ticketsClose,0);
ArrayResize(ticketsClose,closeSize+1);
ArrayResize(lots,closeSize+1);
ticketsClose[closeSize][0] = arrayTickets[i][0]; // # тикета
ticketsClose[closeSize][1] = arrayTickets[i][1]; // тип ордера

// здесь укажем сколько лотов нужно закрыть
lots[closeSize] = arrayTickets[i][2]; // закрываемый объем
// можно закрывать частично, тогда нужно переписать строку сверху
}
//----
return;
}

//+------------------------------------------------------------------+
//| Закрывает ордера с указанными тикетами |
//+------------------------------------------------------------------+
void CloseMarketOrders(int ticketsArray[][2], double lotsArray[])
{
//----
int i,size=ArrayRange(ticketsArray,0);
if (size==0) return;

int ticket,type;
double lots;
bool res;

int total=OrdersTotal();

for (i=0;i<size;i++)
{
ticket = ticketsArray[i][0];
type = ticketsArray[i][1];
lots = lotsArray[i];
RefreshRates(); // на всякий случай обновим сведения о рыночном окружении

// блок закрытия покупок
if (type==OP_BUY)
{
res = OrderClose(ticket,lots,Bid,Slippage,Orange);
if (!res)
{
Print("Не удалось закрыть ордер в покупку #",ticket,"! Ошибка №",GetLastError());
// дальнейшая обработка ошибки, написать самостоятельно
}
}

// блок закрытия продаж
if (type==OP_SELL)
{
res = OrderClose(ticket,lots,Ask,Slippage,Orange);
if (!res)
{
Print("Не удалось закрыть ордер в продажу #",ticket,"! Ошибка №",GetLastError());
// дальнейшая обработка ошибки, написать самостоятельно
}
}

}
//----
return;
}
В функции void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9]) нужно поставить условие после которого решиться оставлять ордер или закрывать его...
Пробовал ставить условия но ничего не получается....
Может кто нибуть посмотрит и покажет есть ли в этих функциях ошибка или это я накасячил....
Файлы:
 
Подскажите, если у меня два раза подряд идёт установка ордеров командой OrderSend, то надо ли мне ставить между ними функцию проверки состояния IsTradeAllowed

или в этом нет необходимости и советник перейдёт от первого вызова OrderSend ко второму только после успешно установленного ордера ?

если IsTradeAllowed ставить все же надо то какую временную задержку надо выставить в цикл while ?
 
Desead:
Подскажите, если у меня два раза подряд идёт установка ордеров командой OrderSend, то надо ли мне ставить между ними функцию проверки состояния IsTradeAllowed

или в этом нет необходимости и советник перейдёт от первого вызова OrderSend ко второму только после успешно установленного ордера ?

В тестере не надо, а на демо или реале получите сообщение о занятом торговом потоке.

Desead:


если IsTradeAllowed ставить все же надо то какую временную задержку надо выставить в цикл while ?
Зависит от скорости исполнения, которая для разных серверов отличается. Не забудьте также добавить проверку в цикле на IsStopped(), а иначе Вам удачи не видать.
 
Здравствуйте! Подскажите пожалуйста, где можно скачать архив подробных котировок (тиковый или минутный)? Те данные что есть в Архиве котировок в МТ 4 (кот наплакал) минутных только дней на 5 теста.
 

Добрый день. В системе предусмотрено три точки входа для BUY и SELL. Но когда поступает сигнал, то позиции открываются на каждом тике пока сигнал существует. Где-то существует ошибка с флагами. Помогите разобраться, пожалуйста.

   static bool buy_h=true, buy_l=true, buy_50=true,
               sell_h=true, sell_l=true, sell_50=true;

 if(LSMA_Sig==0) // up-trend
    {
      if(Stoch_Sig==4 && buy_l==true)
       { 
         sl=Ask-Stop_Loss*Point;
         Ans=OrderSend(Symb,OP_BUY,Lots,Ask,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
           Alert("Неудачная попытка открыть ордер BUY. Ошибка: ", GetLastError());
         if(Ans==true)
            buy_l=false; // снимем флаг
       }
      //---
      if(Stoch_Sig==0 && buy_50==true)
       {
         sl=Ask-Stop_Loss*Point;
         Ans=OrderSend(Symb,OP_BUY,Lots,Ask,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
           Alert("Неудачная попытка открыть ордер BUY. Ошибка: ", GetLastError());
         if(Ans==true)
            buy_50=false;        
       }
      //---
      if(Stoch_Sig==2 && buy_h==true)
       {
         sl=Ask-Stop_Loss*Point;       
         Ans=OrderSend(Symb,OP_BUY,Lots,Ask,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
           Alert("Неудачная попытка открыть ордер BUY. Ошибка: ", GetLastError());
         if(Ans==true)
            buy_h=false;         
       }   
    }
   if(LSMA_Sig==1) // dn-trend
    {
      if(Stoch_Sig==3 && sell_h==true)
       {
         sl=Bid+Stop_Loss*Point;
         Ans=OrderSend(Symb,OP_SELL,Lots,Bid,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
            Alert("Неудачная попытка открыть ордер SELL. Ошибка: ", GetLastError());
         if(Ans==true)
            sell_h=false;
       }
     //---
     if(Stoch_Sig==1 && sell_50==true)
      {
         sl=Bid+Stop_Loss*Point;      
         Ans=OrderSend(Symb,OP_SELL,Lots,Bid,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
            Alert("Неудачная попытка открыть ордер SELL. Ошибка: ", GetLastError());
         if(Ans==true)
            sell_50=false;         
      }
     //---
     if(Stoch_Sig==5 && sell_l==true)
      {
         sl=Bid+Stop_Loss*Point;      
         Ans=OrderSend(Symb,OP_SELL,Lots,Bid,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
            Alert("Неудачная попытка открыть ордер SELL. Ошибка: ", GetLastError());
         if(Ans==true)
            sell_l=false;        
      }
    }
    
   if(Stoch_Sig!=4 && buy_l==false) // поднимем флаг
       buy_l=true;
   if(Stoch_Sig!=0 && buy_50==false)
       buy_50=true;
   if(Stoch_Sig!=2 && buy_h==false)
       buy_h=true;
   if(Stoch_Sig!=3 && sell_h==false)
       sell_h=true;
   if(Stoch_Sig!=1 && sell_50==false)
       sell_50=true;
   if(Stoch_Sig!=5 && sell_l==false)
       sell_l=true;  
 
silhouette:

Добрый день. В системе предусмотрено три точки входа для BUY и SELL. Но когда поступает сигнал, то позиции открываются на каждом тике пока сигнал существует. Где-то существует ошибка с флагами. Помогите разобраться, пожалуйста.

OrdersTotal() выдает количество уже открытых позиций, т.е. с ее помощью можно проверить, есть уже открытая позиция или еще нет.

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