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

 
skyjet:

  Большое спасибо за ответ! Но все же, как описать будущий бар, следующий после Ask[0],Bid[0]?

Как только этот будущий бар появится он станет нулевым. А тот бар, который сейчас [0] будет [1].


Ask и Bid это НЕ массивы, есть только одно текущее значение, все прошлые забываются

 

Помогите пожалуйста разобраться с подсчетом залога
ибо мой расчетный залог совпадает в точности с терминалом 
только когда все ордера полностью локированы
Стоит добавить в систему ордеров еще один ордер - результат залога 
терминала всегда отличается от моего расчетного залога очень незначительно 
но никогда не могу попасть чтобы было пуля в пулю!
Вот очень короткий пример:

На счету открыты 4 ордера в 10.00 лотов каждый, причем два из них байки 
и две селки. Понятно счет стоит в балансе и все ордера локированы
Считаем стандартный залог для каждого ордера , делим на 4 и все тип топ
С терминалом стучит в точности .

Ставим еще одну байку в 1.00 лот по курсу 1,4059 
Считаем залог .  Понятно что за нее надо платить стандартный залог 
так как все имеющиеся ордера стоят в локе.
Для плеча 1:100 имеем залог для новой байки

ZALBuy = 140,59*1.00 = 140.59

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

 ZAL=ZALold + ZALBuy = 1407.23 + 140.59 = 1547.82 

После установки байки в терминале получился залог  1547.91 
Это было бы приемлемо если бы я поставил байку на 9 пунктов выше
по курсу 1,4068   Ибо если мы посчитаем реальное увеличения залога 
как разность залога ДО и ПОСЛЕ  то получаем как раз стандартный залог 
для 1.00 лота по курсу 1,4068 

1547.91 - 1407.23 = 140.6801

Заменил версию терминала - увы не помогло! 

-----------------------------------------------

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


С   Уважением   MADZX
 
keep87:


Про эту настройку можете забыть. Реквота возникает если кухня хочет отобрать ваши деньги, им наплевать какой там зазор они все равно это сделают ) Таковые реалии алготрейдинга у большинства компаний лохотронов которые именуют себя "лучший брокер XXXXX" (XXXXXX - вставить название континента или галактики чего уж там) 

Меняй не меняй настройку, все останется также. 


Абсолютно точно сказано !  Я тоже с этим встречался !
 
skyjet:
Здравствуйте ! Подскажите описание настоящего бара +1. Например я нуждаюсь в цене следующего бара, не настоящего. 

Вы насколько я понял пытаетесь получить у машины информацию из будущего 
Если найдете способ - поделитесь, буду благодарен :)
 
Kobalerro:
Приветствую всех. Сам в программировании новичок, поэтому прошу решить задачу.

Необходимо, чтобы несколько советников на одном счету, открывали ограниченное количество ордеров.

К примеру: 10 советников но открыть можно только 5 ордеров, но не более одного на валютную пару.

Реализовано это следующим образом, но работает не так.

extern int МаксКолОрдеров   = 5;

//+------------------------------------------------------------------+

int ПодсчетОткрОрдеров() {
  int k=OrdersTotal();
   if (Символ=="0") Символ=Symbol();
    for (int i=МаксКолОрдеров; i<k; i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Символ || Символ=="") {
       if (МагикНомер<0 || OrderMagicNumber()==МагикНомер) {
      if (OrderMagicNumber()<1) return(True);
     }
    }
   }
  }
 return;

}

//+------------------------------------------------------------------+
int start()
  {
   if(ПодсчетОткрОрдеров()==0)ПровТоргУсловий();
   }


Я бы реализовал подобное шоу следующим образом:
Все 10 ваших лошадок работают каждый на своем графике , как бы в соседних комнатах 
и потому никто из них не в курсе что делает сосед за стеной - эта основная проблема 
для Вашей затеи!
Поэтому я бы каждому советнику поручил писать свои действия в дисковый файл
который будет доступен всем лошадкам, ибо находится в директории терминала .
При возникновении у кого либо из них жгучего желания чего - нибудь наваять в своем окне
надо прежде проанализировать этот файл и проверить возможность реализации
этого желания !  
применительно к Вашему сценарию шоу в файл надо писать количество ордеров
и валютные пары по которой они открыты
Типа :
EURUSD      1      
GBPUSD      1      
EURGBP      0

Здесь мы видим что открывать сделки по EURUSD  и GBPUSD  нельзя  ибо по сценарию не положено 
иметь более одного ордера на пару. 
Понятно что строк будет столько сколько пар в работе .
При таком решении все Ваши лошадки всегда будут в курсе что происходит в текущий момент 
и смогут вычислить допустимо ли какое либо действие в данный момент или нет.
При установке  ордера по какой либо паре надо поставить единичку в нужной строке 
При закрытии - заменить ее на нолик
Это точно будет работать , хотя и слегка сложно в реализации для новичка 
Однако дерзайте ибо все там были - типа были новичками до поры до времени !  

Удачной охоты !   
MADZX

 

Я пишу откатную стратегию. Мне необходимо, что бы над(под) экстремумом соответствующей свечи ставился стоповый ордер. Вот пример:

 

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

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

 

int CandleType()
{
  if(Open[1] > Close[1])
    return(BullCandle);
    
  if{Open[1] < Close[1]}
    return(BearCandle);
    
  return(dodji);
}

 Далее нужно как-то запросить, что мол бар с индексом 1 бычий или медвежий... и .. что-н. делать..

 Как это сделать? 

 
madzx:


Я бы реализовал подобное шоу следующим образом:
Все 10 ваших лошадок работают каждый на своем графике , как бы в соседних комнатах 
и потому никто из них не в курсе что делает сосед за стеной - эта основная проблема 
для Вашей затеи!
Поэтому я бы каждому советнику поручил писать свои действия в дисковый файл
который будет доступен всем лошадкам, ибо находится в директории терминала .
При возникновении у кого либо из них жгучего желания чего - нибудь наваять в своем окне
надо прежде проанализировать этот файл и проверить возможность реализации
этого желания !  
применительно к Вашему сценарию шоу в файл надо писать количество ордеров
и валютные пары по которой они открыты
Типа :
EURUSD      1      
GBPUSD      1      
EURGBP      0

Здесь мы видим что открывать сделки по EURUSD  и GBPUSD  нельзя  ибо по сценарию не положено 
иметь более одного ордера на пару. 
Понятно что строк будет столько сколько пар в работе .
При таком решении все Ваши лошадки всегда будут в курсе что происходит в текущий момент 
и смогут вычислить допустимо ли какое либо действие в данный момент или нет.
При установке  ордера по какой либо паре надо поставить единичку в нужной строке 
При закрытии - заменить ее на нолик
Это точно будет работать , хотя и слегка сложно в реализации для новичка 
Однако дерзайте ибо все там были - типа были новичками до поры до времени !  

Удачной охоты !   
MADZX

 Спасибо за совет, но что-то через чур мудрено. И потом в вашем варианте получается работают все, а требуется 10 проверяют условие для входа,

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

а не ограниченная  EURUSD      1  ,    GBPUSD      1 ,     EURGBP      0.

По моему должно быть более простое решение. На подобие подсчет общего количества ордеров с условием ограничения заданным параметром.

И ограничение либо по символу, либо по магику не более одного.

Хотя, возможно ваш вариант тоже подойдет, но как реализовать это в коде, я не могу сообразить.

 
hoz:

 У меня тут странная штука входит. Вот функции открытия ордеров:

вот тут ошибка: 

if(SL < g_stopLevel)
    SL = g_stopLevel*pt;

если стоп левел = 5 то вы пытаетесь поставить стоп лосс на 0.00005. 

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

научитесь пользоваться принтами (print). Просто ставьте Print(); в нужном месте, в скобочки забрасываете нужные переменные и разделяете их этим: ," ",  вот так например: Print(Price," ",SL); и при тестировании в момент открытия ордера во вкладке "эксперты" вы увидите чему равны эти переменные, и сможете понять что не так.

также в журнале пишется что пытается сделать советник, куда поставить стоп лосс, куда тейк профит. Там будет видино все что нужно.

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

 все несколько проще, будем работать внутри функции start.

с начало создадим переменную в которую запишем направление прошлой свечи. 

int Candle=-1;

будем ее заполнять определенным занчением, одни из которых будет обозначать что сввеча бычья, другое что медвежья. если -1, значит никакая (не удалось определить либо она без направления close=open).

Значение предлагаю использовать по аналогии с торговым приказом 0 - buy, 1 - sell;

далее пишем:

if(Close[1]>Open[1]) Candle=0; else
   if(Close[1]<Open[1] Candle=1;

вот теперь у нас определено направление и мы его на прямую можем использовать в функции OrderSend( string symbol, int cmd, ...остальная хренотень...);

if(Candle!=-1) OrderSend (Symbol(),Candle,   ...остальная хренотень...);

или же по вашей аналогии:

if(Candle==0) OpenBuy();
if(Candle==1) OpenSell(); 

 
Kobalerro:

 Спасибо за совет, но что-то через чур мудрено. И потом в вашем варианте получается работают все, а требуется 10 проверяют условие для входа,

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

а не ограниченная  EURUSD      1  ,    GBPUSD      1 ,     EURGBP      0.

По моему должно быть более простое решение. На подобие подсчет общего количества ордеров с условием ограничения заданным параметром.

И ограничение либо по символу, либо по магику не более одного.

Хотя, возможно ваш вариант тоже подойдет, но как реализовать это в коде, я не могу сообразить.


А может так :

if(NumberOfPositions("EURUSD")==0 && NumberOfPositions()<10)
А зесь функция
 
keep87:

вот тут ошибка: 

если стоп левел = 5 то вы пытаетесь поставить стоп лосс на 0.00005. 

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

научитесь пользоваться принтами (print). Просто ставьте Print(); в нужном месте, в скобочки забрасываете нужные переменные и разделяете их этим: ," ",  вот так например: Print(Price," ",SL); и при тестировании в момент открытия ордера во вкладке "эксперты" вы увидите чему равны эти переменные, и сможете понять что не так.

также в журнале пишется что пытается сделать советник, куда поставить стоп лосс, куда тейк профит. Там будет видино все что нужно. 

 Так пользуюсь периодически. Вот смотрите, щяс функции так выглядят:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  int ticket = -1;
  string myNote = "Сов баянул";
  
  double price = High[1] + i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = Low[1] - i_thresholdFromBasedSL*pt ;
  Print("SL = ", SL);

  if(price > Ask)
  {
    ticket = OrderSend(Symbol(),OP_BUYSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Navy);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(High[1] + i_tp*pt,Digits),0,Navy))
    return(false);
  
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  int ticket = -1;
  string myNote = "Сов шортанул";
  
  double price = Low[1] - i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = High[1] + i_thresholdFromBasedSL*pt;
  Print("SL = ", SL);
  
  if(price < Bid)
  {
    ticket = OrderSend(Symbol(),OP_SELLSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Red);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(Low[1] - i_tp*pt,Digits),0,Red))
    return(false);
    
  return(true);
}

 В журнале читаю:

2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: modify #1 buy stop 0.10 EURUSD at 1.32103 sl: 1.32007 tp: 1.32243 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: open #1 buy stop 0.10 EURUSD at 1.32103 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3201
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.321
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: OrderSend error 130
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3194
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.3204
2012.12.25 18:20:14     5_minites_TS_by_Philippe Nell inputs: i_fastMaPeriod=10; i_slowMaPeriod=21; i_filtrMaPeriod=50; i_trading_TF=5; i_thresholdFromInput=1; i_thresholdFromBasedSL=1; i_slippage=3; i_tp=15; i_myMagic=33330215; 
2012.12.25 18:20:12     5_minites_TS_by_Philippe Nell EURUSD,M5: loaded successfully

 Получается изначально от цены покупки до стопа была разница 1.3204 - 1.3194 = 0.001 points

Дальше 1.3210 - 1.3201 = 0.009 points 

И почему-то во втором случает стоп был ближе к цене входа, НО ошибки НЕТ! Я вот думал, и не понял этого.

 Исправил я ошибку позже иначе. Вот в коде уже есть условия:

if(price > Ask) &&  if(price < Bid) соответственно для покупок  и продаж. Или были другие вариант? Щяс ошибок больше нет. Но, тем не менее, хочется выслушать мнение более опытного программиста. 

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