Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1098

 
wishmast:

Ребят, уже голову сломал. Как сделать чтоб советник выставлял отложки по максимумам и минимумам, например за 8 свечей, с тейком в 1/4 .

делаю примерно так:

double Vhod1=iHighest(Symbol(),0,MODE_HIGH,8,0);

 double Vhod2=iLowest(Symbol(),0,MODE_LOW,8,0); 

 double TP=((Vhod1-Vhod2)/4)+Vhod1; 


пробовал менять параметры, но пишет то стопы не верны, то выставит по цене 7.00000 непонятно откуда берет

iHighest, iLowest выдадут адрес свечи а не цену, справку и учебник читайте.
 
evillive:
iHighest, iLowest выдадут адрес свечи а не цену, справку и учебник читайте.

Так точно. Надо

double Vhod1=iHigh(Symbol(), 0, iHighest(Symbol(),0,MODE_HIGH,8,0));

double Vhod2=iLow(Symbol(), 0, iLowest(Symbol(),0,MODE_LOW,8,0));

 
alvlaf:


Вставил неправильно, но он всё равно не сработал бы как надо, потому что... Потому что.)) Короче, надо вот так:

1)  в ините создаем переменную AllowNewOrders (если ее нет)

2)  создаем новый ордер, пока он не закроется OnTick этого символа простаивает, но будет работать OnTick другого символа

3)  пункт 2 для других символов выполняем, пока не достигнем предела MaxOpenOrders

4)  при завершении ордера, если он убыточный или нулевой, запрещаем через AllowNewOrders открытие новых ордеров для всех копий

     [отсюда сразу проблема- когда убыточная серия завершается, AllowNewOrders=1, а если MaxOpenOrders>1 и этих сессий несколько?]

5)  если пункт 4 не выполняется, значит можно открывать новые ордера.

Программа ДОЛЖНА УЖЕ работать при MaxOpenOrders=1. Возможно еще возникнет проблема, когда вслед за убыточным ордером запрещаем новые ордера AllowNewOrders=0, а следующий OrderSend по каким-то причинам ордер не откроет. Ниже напишу, как я страхуюсь на этот случай...

int OnInit()                     
{
   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders", 1);
   return(INIT_SUCCEEDED);
}
//----------------------------------------------------------------------
void OnTick()
{
   if (CountTrades() == 0)  // Количество ордеров должно равняться нулю
   {
      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 
      // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder(), 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
      || CountHistTrades() == 0)
      // Если последняя сделка прибыльная или это первая сделка, то открывается ордер
      {
         if (OrdersTotal() >= MaxOpenOrders || GlobalVariableGet("AllowNewOrders") == 0) return;
         if (SignalBuy())
         {
            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
         if (SignalSell())
         {
            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
      }
   }
}
 
A13ksandr:

Ниже напишу, как я страхуюсь на этот случай...

int Tries = 5;
ResetLastError();
do
{
   // решение ошибок с предыдущей попытки открытия ордера, например:
   if (_Error == 134)
   {
      _Lot = NormalizeDouble(_Lot / 2, 2);
      if (_Lot < SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN)) _Lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   }
   if (_Error == 138) RefreshRates();
   Ticket = OrderSend(Symbol(), OP_BUY, _Lot, Ask, 3, 0, 0, NULL, 0, 0, clrNONE);
   if (Ticket < 0)
   {
      _Error = GetLastError();
      Sleep(100);
   }
   Tries--;
}
while (Ticket < 0 && Tries > 0);

 Если грамотно решение ошибок предусмотреть, то процент успешности открытия ордера возрастает.

 
Здравствуйте! Подскажите пожалуйста при использовании функции из поста (каждому ордеру свой магик) — http://forum.forexpeoples.ru/showthr...=1#post1715092 , как будет выглядеть поиск последних ордеров для продаж или покупок, или модернизации серии ордеров, если не каждому ордеру свой магик, а каждой серии ордеров свой магик. Т.е. предполагается, что когда открывается новая серия ордеров со своим магиком, старые серии продолжают открывать свои ордера со своими магиками. У каждой серии планируется свой профит и таких серий ордеров множества.

Как может изменится код внизу при таких условиях?
for(cnt=OrdersTotal()-1;cnt>=0;cnt--){
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber() < startMagicNumber || OrderMagicNumber() >= startMagicNumber + MaxTrades) continue;

Код генерации магика поставил при открытии первых ордеров серий, но вот проблема при открытии новых ордеров в этих же сериях.

Сам код генерации магика из поста:
//+------------------------------------------------------------------+
// keekkenen: получаем следующий магик в серии
int getNextMagicNumber(){
int magic = EMPTY;

if (OrdersTotal() == 0) {
return(startMagicNumber);
}

for (int i = startMagicNumber; i < startMagicNumber + MaxTrades; i++){
magic = checkMarketByMagic(i);
if (magic != EMPTY) break;
}

if (magic == EMPTY){
magic = startMagicNumber; // первый в серии
} else {
magic++; //следующий в серии
}

return(magic);
}
//+------------------------------------------------------------------+
// keekkenen: проверяем наличие ордера в рынке с заданным магиком
int checkMarketByMagic(int magic){
for(int i = 0; i < OrdersTotal(); i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() == magic) return(magic);
}
return(EMPTY);
}
//+------------------------------------------------------------------+
 
Доброго времени суток господа форумчане, 
извиняюсь если спутал ветки, но куда приткнуть правильно ТЕМУ не нашел, так что не пинайте.

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

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

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

Если грубо говоря то тех задание выглядело бы так:

1. Открыли позицию в ручную, например buy.
2. Советник выставил ему стоплосс и тейкпрофит по настройкам.
3. Ордер закрылся по тейкпрофиту - советник сразу открывается еще один buy и выставляет ему те же стоплосс и тейкпрофит, до тех пор пока не поймает первый стоплосс либо если есть конечный тейкпрофит.
4. Если позиция закрылась по стоплоссу то робот больше ничего не предпринимает. Советник ждет открытия следующего ордера в ручную.

Все.

Буду примного благодарен.
 
A13ksandr:


Вставил неправильно, но он всё равно не сработал бы как надо, потому что... Потому что.)) Короче, надо вот так:

1)  в ините создаем переменную AllowNewOrders (если ее нет)

2)  создаем новый ордер, пока он не закроется OnTick этого символа простаивает, но будет работать OnTick другого символа

3)  пункт 2 для других символов выполняем, пока не достигнем предела MaxOpenOrders

4)  при завершении ордера, если он убыточный или нулевой, запрещаем через AllowNewOrders открытие новых ордеров для всех копий

     [отсюда сразу проблема- когда убыточная серия завершается, AllowNewOrders=1, а если MaxOpenOrders>1 и этих сессий несколько?]

5)  если пункт 4 не выполняется, значит можно открывать новые ордера.

Программа ДОЛЖНА УЖЕ работать при MaxOpenOrders=1. Возможно еще возникнет проблема, когда вслед за убыточным ордером запрещаем новые ордера AllowNewOrders=0, а следующий OrderSend по каким-то причинам ордер не откроет. Ниже напишу, как я страхуюсь на этот случай...

Спасибо Александр, завтра проверю.  [отсюда сразу проблема- когда убыточная серия завершается, AllowNewOrders=1, а если MaxOpenOrders>1 и этих сессий несколько?] Если MaxOpenOrders>1 на какое то значение, то по идее AllowNewOrders=1 тоже должен быть больше на это же значение. Но с этим можно пока не заморачиваться и MaxOpenOrders убрать вообще, так как в этом варианте программы все равно не планируется больше одной серии.
 
alvlaf:
Спасибо Александр, завтра проверю.  [отсюда сразу проблема- когда убыточная серия завершается, AllowNewOrders=1, а если MaxOpenOrders>1 и этих сессий несколько?] Если MaxOpenOrders>1 на какое то значение, то по идее AllowNewOrders=1 тоже должен быть больше на это же значение. Но с этим можно пока не заморачиваться и MaxOpenOrders убрать вообще, так как в этом варианте программы все равно не планируется больше одной серии.
Попробовал, первые пять минут работал нормально, потом стал открывать одновременно несколько сделок (4) причем по одной и той же паре с увеличенным лотом. Александр, мне не совсем понятно в твоём варианте   каким образом глобальная переменная получает и изменяет своё значение?
 

Привет всем ! 

Вот есть такой графический объект на графике.

 

В его параметрах время, значение , код. Значение соответствует цене, на уровне которой находится объект.

Можно как-то получить  его время и значение ( через функцию или еще как) ?

\\\\\

Шире вопрос можно поставить так : есть ли объекты ( кроме трендовых линий, линий фибонначи, ганна ), у которых можно получить сразу время и цену ?

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

 

Спасибо за ответы !

PS Только начал изучение... 

 
ilmel:

Привет всем ! 

Вот есть такой графический объект на графике.

 

В его параметрах время, значение , код. Значение соответствует цене, на уровне которой находится объект.

Можно как-то получить  его время и значение ( через функцию или еще как) ?

\\\\\

Шире вопрос можно поставить так : есть ли объекты ( кроме трендовых линий, линий фибонначи, ганна ), у которых можно получить сразу время и цену ?

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

 

Спасибо за ответы !

PS Только начал изучение... 

https://docs.mql4.com/ru/objects/objectgetdouble
https://docs.mql4.com/ru/objects/objectgetinteger
Причина обращения: