Хилп! Хилп! - страница 4

 
RaptorUK:
Что делать... Вы не объяснили, что вы хотите сделать... несмотря на то, что вам задавали конкретные вопросы... Если вы игнорируете вопросы, которые задаются для того, чтобы вам помогли, то вас очень быстро проигнорируют.

турбировать или не турбировать
 
jameslarry:

турбировать или не турбировать
Ладно, наслаждайся... тебе не нужна помощь.
 
У меня есть система, которая делает это так, как я хотел, я скоро выложу ее для вас, ребята.
 

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

extern double LotPerThousand=0.1;  // If you had 1000 balance what lot size would you use

int start()
{

double lots;

lots=NormalizeDouble((LotPerThousand/1000)*AccountBalance(),2);
if(lots<MarketInfo(Symbol(),MODE_MINLOT)){ lots=MarketInfo(Symbol(),MODE_MINLOT); }
if(lots>MarketInfo(Symbol(),MODE_MAXLOT)){ lots=MarketInfo(Symbol(),MODE_MAXLOT); }

...
OrderSend(Symbol(),OP_BUY,lots,...)
...

return 0;
}
 
tonny:
Ну, поскольку вы, похоже, хотите, чтобы это было как можно проще, поскольку вы новичок, я искал самое простое для понимания.
Извините, Тонни, размер лота должен быть между minlot и maxlot И кратен lotStep.
double NormalizeLots(double lots, string pair=""){
    if (pair == "") pair = Symbol();
    double  lotStep     = MarketInfo(pair, MODE_LOTSTEP),
            minLot      = MarketInfo(pair, MODE_MINLOT);
    lots            = MathRound(lots/ls) * ls;
    if (lots < minLot) lots = 0;    // or minLot
    return(lots);
}
 
tonny:

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


Бинго! Тонни, это именно то, что я хотел. Он работает в тестере стратегий и автоматически увеличивает размер лота, поддерживая процент. Это лучше, чем мой предыдущий вариант с бесчисленными операторами if, спасибо всем! :-)
 
Ну, я просто помню математику, где если a равно b, то c равно? Формула будет (b/a)*c, в данном случае c - это баланс вашего счета. И результат зависит от отношения a:d, т.е. допустим, результат равен d, тогда a:b равно c:d, а b:a равно d:a. Затем просто поместите формулу в normalize double, чтобы получить округленное до двух знаков после запятой значение лота в случае, если вычисления вернут больше знаков после запятой, чем два, которые ordersend отвергнет как недопустимый размер лота. Затем проверьте, меньше ли это значение минимального требуемого лота, если да, то используйте минимальное требуемое значение, а если больше максимального требуемого лота, то используйте максимальное значение лота.
/* new value of lot would be (old lot/old balance)*new balance in this case we fix old balance at 1000 and new balance is the current balance i.e. (LotPerThousand/1000)*AccountBalance() */

lots=NormalizeDouble((LotPerThousand/1000)*AccountBalance(),2);                            // round two 2 decimal places incase more than 2 decimal places is returned
if(lots<MarketInfo(Symbol(),MODE_MINLOT)){ lots=MarketInfo(Symbol(),MODE_MINLOT); }        // if lower than minimum required use the minimum
if(lots>MarketInfo(Symbol(),MODE_MAXLOT)){ lots=MarketInfo(Symbol(),MODE_MAXLOT); }        // if higher than maximum required use the maximum
 
Большое спасибо!
 
WHRoeder:
Извините, Тонни, размер лота должен быть между minlot и maxlot И кратен lotStep.

уважаемый WHRoeder, пожалуйста, не вводите людей в заблуждение, давая коды, в которых просто много ошибок, вы не определили объект ls в коде и даете его кому-то для использования, пожалуйста, прекратите свое озорство.

 
tonny:

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


Тонни, спасибо большое за код, который вы дали, он действительно работает очень хорошо.



Я искал его 2 дня и даже поссорился с женой по этому поводу!


спасибо