Округляет ли MathFloor десятичные знаки до ближайшего ЦЕЛОГО числа?
MathFloor() делает то, что написано в документации... "Функция MathFloor возвращает числовое значение, представляющее наибольшее целое число, которое меньше или равно x".
ДомЖильберто:
Имеет ли смысл использовать FirstTarget как пользовательский параметр в "OrderClose()" - Если предположить, что "sizeClose" был правильным? (см. процитированный код)
Нет... у вас есть это:
FirstTarget = OrderTakeProfit()-OrderOpenPrice()/2+OrderOpenPrice();
// meaning this
FirstTarget = OrderTakeProfit() - ( OrderOpenPrice() / 2 ) + OrderOpenPrice();
Что касается печати пользовательских переменных, как я могу сделать это для "FirstTarget_Buy"?
Я собираюсь потратить время на то, чтобы просмотреть весь мой код и вывести много информации - я понимаю, как это сделать с bools и ints (целое число -1 не работает, а bool - это истинное или ложное утверждение - легко.), но я не понимаю, как это сделать, когда вы присваиваете функции пользовательской переменной?
Спасибо, что пролили свет на формулу "FirsTarget" выше! Извините, я хотел сказать, что ваш код не помог в том смысле, что я не понимаю, как составить формулу... Я нахожу это действительно контр-интуитивным - можно было бы подумать, что вызов "OrderSelect" позволит вам просто увидеть, какой размер лота был на этом тиковом ордере... и затем просто разделить его...
Вовсе нет, вам просто нужно найти свое слепое пятно и просветить его, как только вы это сделаете, вы удивитесь, почему вам было так трудно, все легко, когда вы знаете как.
DomGilberto:
Что касается печати пользовательских переменных, как бы я сделал это для "FirstTarget_Buy"?
Я собираюсь потратить время на то, чтобы просмотреть весь мой код и распечатать много - я понимаю, как это сделать с bools и ints (integer -1 fail, а bool это true или false statement - легко.), но я не понимаю, как это сделать, когда вы присваиваете функции пользовательской переменной?
Вот так... также обратите внимание на комментарий о фигурных скобках
if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
{
OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);
double Lots=OrderLots();
double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );
Print("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy, Digits) ); // prints FirstTarget_Buy with the same number of digits as the current symbol
{ // why this brace ?double minLot = MarketInfo(Symbol(), MODE_MINLOT),
lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
half = MathFloor(Lots/2/lotStep)*lotStep;
if (half < minLot) half = Lots;
half=Lots/2;
OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
} // why this brace ?
}
ДомЖильберто:
Я хотел сказать, что ваш код не помог в том смысле, что я не понимаю, как составить формулу... Я нахожу это действительно контр-интуитивным - Вы могли бы подумать, что вызов "OrderSelect" позволит Вам просто увидеть, какой размер лота был на этом тиковом ордере... и затем просто разделить его...
Вы можете просто выбрать ордер, использовать OrderLots() и разделить на два... Вы можете сделать это, и во многих ситуациях это будет работать. Я пишу код для всех случаев, которые я могу предвидеть, чтобы мне не пришлось постоянно исправлять его, когда он ломается...
Если размер вашей позиции составляет 2.0 лота; это деленное на два будет 1.0 лот, и это будет работать...
Если размер вашей позиции 0.3 лота; это деление на два будет 0.15 лота, и это будет недопустимый размер позиции, если MODE_LOTSTEP равен 0.1 ... вы можете использовать 0.1 или 0.2 НЕ 0.15, поэтому вам нужно закодировать эту проверку и настройку.
То, что у вас есть здесь, не будет работать во всех случаях ...
Ахххх! Я только что провел последние 15-20 минут, размазывая отпечатки по всему месту - я начинаю понимать, где я ошибаюсь. По сути, я выбираю отложенный заказ... НО, поскольку это отложенный ордер, в тот момент, когда я его выбираю, есть большая вероятность, что OrderLots, стоп и цели изменились, поэтому мне нужно поместить его в цикл, чтобы он синхронизировался с тем, как мои отложенные ордера постоянно рассчитываются до их срабатывания.
Этот чертов doubletostr :P - Точно, RaptorUK! Теперь я вижу, что все рассчитано правильно, благодаря вашей корректировке :)
Думаю, теперь я знаю, как сделать большую часть этого - просто из любопытства, какой оператор "if" будет работать, чтобы вызывать ТОЛЬКО тот ордер, который был ТРИГГЕРИРОВАН. На данный момент я вызываю его, когда у меня открыт рыночный ордер, но я пытаюсь понять, как мне вызывать, когда сработал отложенный ордер?
Код ниже и соответствующий оператор "if" просто вызывают открытые отложенные ордера. Просто нужен способ "перейти" к определенной пользовательской функции (например, void) на основании того, что сработал ордер? (Если это имеет смысл!)
Спасибо, что многое прояснили для меня :)
int OpenOrdersThisPair(string pair)
{
int total=0;
for(int i=OrdersTotal()-1; i >= 0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==pair) total++;
}
return (total);
}
if(OpenOrdersThisPair(Symbol())>0)
Ахххх! Я только что провел последние 15-20 минут, размазывая отпечатки по всему месту - я начинаю понимать, где я ошибаюсь.
Легко, когда знаешь как
DomGilberto:
Думаю, теперь я знаю, как сделать большую часть этого - Просто из любопытства, какой оператор "if" будет работать, чтобы вызывать ТОЛЬКО тот ордер, который был ТРИГГЕРИРОВАН. На данный момент я вызываю его, когда у меня открыт рыночный ордер, но я пытаюсь понять, как мне вызывать, когда сработал отложенный ордер?
Когда отложенный ордер срабатывает, он становится OP_BUY или OP_SELL, так что ....
Один совет - используйте больше пробелов ... когда вы получаете ошибку деления на ноль и хотите найти, где это происходит, легко искать пробел/пробел и просто найти ваши деления вместо всех ваших комментариев ... поэтому я использую пробелы вокруг = + - / % и т.д.
Хорошо, я вернулся! ... Не очень хорошие новости - я пробовал и тестировал множество вариаций кода безрезультатно. Вот на чем я сейчас остановился.
Я не получаю никакой информации относительно отпечатков? Абсолютно ничего не появляется в журнале. Я предполагаю, что это происходит потому, что ничего не выбирается в качестве OrderType прямо из первого оператора "if"? Из того, что я вижу здесь в коде, я бы подумал, что я не далеко ушел, по крайней мере...?
if(OrderType() == OP_BUY ){
for( int c=OrdersTotal()-1; c >=0; c-- )
{
if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
Print("Order Ticker Number = ",OrderTicket());
Print("Order Lots Open = ", OrderLots());
}
elseif(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
Print("Order Select returned the error of ", GetLastError());
}
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
if(OrderType()==OP_BUY)
if(OpenOrdersThisPair(Symbol())==1)
//if( Bid == FirstTarget_Buy) double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
}
double minLot = MarketInfo(Symbol(), MODE_MINLOT);{
Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
}
double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
}
double half = MathCeil(OrderLots()/2/lotStep)*lotStep;{
Print("The Lots to close is: ", DoubleToStr( half, Digits ));
}
bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
}
}
DomGilberto: Хорошо, я вернулся! ... Но новости не очень хорошие - я пробовал и тестировал множество вариантов кода, но безуспешно. Вот на чем я сейчас остановился.
Я не получаю никакой информации об отпечатках? Абсолютно ничего не появляется в журнале. Я предполагаю, что это происходит потому, что ничего не выбирается в качестве OrderType прямо из первого оператора "if"? Из того, что я вижу здесь в коде, я бы подумал, что я не далеко ушел, по крайней мере...?
Как вы выбираете заказ перед тем, как сделать это?
if(OrderType() == OP_BUY ){
У вас все еще есть проблемы здесь
for( int c=OrdersTotal()-1; c >=0; c-- )
{
if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
Print("Order Ticker Number = ",OrderTicket());
Print("Order Lots Open = ", OrderLots());
}
elseif(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
Print("Order Select returned the error of ", GetLastError()); // OrderSelect has failed, why do you continue . . .
}
if(OrderMagicNumber()==MagicNumber) // . . . to this line ?if(OrderSymbol()==Symbol())
if(OrderType()==OP_BUY)
if(OpenOrdersThisPair(Symbol())==1)
//if( Bid == FirstTarget_Buy)
for( int c = OrdersTotal()-1; c >= 0; c-- )
{
if( OrderSelect(c, SELECT_BY_TICKET, MODE_TRADES) )
{
Print("Order Ticker Number = ",OrderTicket());
Print("Order Lots Open = ", OrderLots());
}
else
{
Print("Order Select returned the error of ", GetLastError());
continue; // try next order position in the loop
}
if(OrderMagicNumber() == MagicNumber)
if(OrderSymbol() == Symbol())
if(OrderType() == OP_BUY)
if(OpenOrdersThisPair(Symbol()) == 1)
Не могу поверить, что я делаю эти ошибки новичков... Бесит! Да, у меня теперь печатается и выбирается ордер. Это код, который работает в плане печати - лоты все еще не закрываются? Я также вставил сообщения журнала ниже.
if(OrderSelect(OrdersTotal(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1){
double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
}
double minLot = MarketInfo(Symbol(), MODE_MINLOT);{
Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
}
double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
}
double half = MathCeil(OrderLots()/2/lotStep)*lotStep;{
Print("The Lots to close is: ", DoubleToStr( half, Digits ));
}
for( int c=OrdersTotal()-1; c >=0; c-- )
{
if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
Print("Order Ticker Number = ",OrderTicket());
Print("Order Lots Open = ", OrderLots());
}
else{
Print("Order Select returned the error of ", GetLastError()); // Order Select does not seem to want to work?continue;
}
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
if(OrderType()==OP_BUY)
if(OpenOrdersThisPair(Symbol())==1)
bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
}
}
2013.07.31 11:13:52 2013.02.01 16:00 trendfishing_play_ground EURUSD,H1: Order Select returned the error of 0 // Not sure what is going on here?
2013.07.31 11:13:52 2013.02.01 16:00 trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000 // This is the right calculation based
// upon the total lots opened on a pending order - to half.
2013.07.31 11:13:52 2013.02.01 16:00 trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.07.31 11:13:52 2013.02.01 16:00 trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.07.31 11:13:52 2013.02.01 16:00 trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This price is also correct.
Округляет ли MathFloor десятичные знаки до ближайшего ЦЕЛОГО числа?
MathFloor() делает то, что написано в документации... "Функция MathFloor возвращает числовое значение, представляющее наибольшее целое число, которое меньше или равно x".
Имеет ли смысл использовать FirstTarget как пользовательский параметр в "OrderClose()" - Если предположить, что "sizeClose" был правильным? (см. процитированный код)
Нет... у вас есть это:
когда вы, вероятно, имеете в виду это...
FirstTarget = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 ) ;Используйте скобки (и пробелы), чтобы все было ясно и недвусмысленно.
Ваш код не помог - извините.
Почему? Это неправильно? В каком смысле?
Можете ли вы вывести пользовательские переменные? Если да, то я, должно быть, делаю это неправильно, поскольку они не отображаются в журнале.
Да, вы можете вывести любые переменные. ... что вы делаете? Покажите ваш код.
if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP) { OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); double Lots=OrderLots(); double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{ double minLot = MarketInfo(Symbol(), MODE_MINLOT), lotStep = MarketInfo(Symbol(), MODE_LOTSTEP), half = MathFloor(Lots/2/lotStep)*lotStep; if (half < minLot) half = Lots; half=Lots/2; OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet); } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_SELLSTOP) { OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); double FirstTarget_Sell = OrderOpenPrice() - ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{ if (half < minLot) half = Lots; half=Lots/2; OrderClose(OrderTicket(),half,FirstTarget_Sell,3,DarkViolet); } }Что касается печати пользовательских переменных, как я могу сделать это для "FirstTarget_Buy"?
Я собираюсь потратить время на то, чтобы просмотреть весь мой код и вывести много информации - я понимаю, как это сделать с bools и ints (целое число -1 не работает, а bool - это истинное или ложное утверждение - легко.), но я не понимаю, как это сделать, когда вы присваиваете функции пользовательской переменной?
Спасибо, что пролили свет на формулу "FirsTarget" выше! Извините, я хотел сказать, что ваш код не помог в том смысле, что я не понимаю, как составить формулу... Я нахожу это действительно контр-интуитивным - можно было бы подумать, что вызов "OrderSelect" позволит вам просто увидеть, какой размер лота был на этом тиковом ордере... и затем просто разделить его...
Извините, что показался полным идиотом!
Извините, что показался полным идиотом!
Вовсе нет, вам просто нужно найти свое слепое пятно и просветить его, как только вы это сделаете, вы удивитесь, почему вам было так трудно, все легко, когда вы знаете как.
Что касается печати пользовательских переменных, как бы я сделал это для "FirstTarget_Buy"?
Я собираюсь потратить время на то, чтобы просмотреть весь мой код и распечатать много - я понимаю, как это сделать с bools и ints (integer -1 fail, а bool это true или false statement - легко.), но я не понимаю, как это сделать, когда вы присваиваете функции пользовательской переменной?
Я хотел сказать, что ваш код не помог в том смысле, что я не понимаю, как составить формулу... Я нахожу это действительно контр-интуитивным - Вы могли бы подумать, что вызов "OrderSelect" позволит Вам просто увидеть, какой размер лота был на этом тиковом ордере... и затем просто разделить его...
Вы можете просто выбрать ордер, использовать OrderLots() и разделить на два... Вы можете сделать это, и во многих ситуациях это будет работать. Я пишу код для всех случаев, которые я могу предвидеть, чтобы мне не пришлось постоянно исправлять его, когда он ломается...
Если размер вашей позиции составляет 2.0 лота; это деленное на два будет 1.0 лот, и это будет работать...
Если размер вашей позиции 0.3 лота; это деление на два будет 0.15 лота, и это будет недопустимый размер позиции, если MODE_LOTSTEP равен 0.1 ... вы можете использовать 0.1 или 0.2 НЕ 0.15, поэтому вам нужно закодировать эту проверку и настройку.
То, что у вас есть здесь, не будет работать во всех случаях ...
Ахххх! Я только что провел последние 15-20 минут, размазывая отпечатки по всему месту - я начинаю понимать, где я ошибаюсь. По сути, я выбираю отложенный заказ... НО, поскольку это отложенный ордер, в тот момент, когда я его выбираю, есть большая вероятность, что OrderLots, стоп и цели изменились, поэтому мне нужно поместить его в цикл, чтобы он синхронизировался с тем, как мои отложенные ордера постоянно рассчитываются до их срабатывания.
Этот чертов doubletostr :P - Точно, RaptorUK! Теперь я вижу, что все рассчитано правильно, благодаря вашей корректировке :)
Думаю, теперь я знаю, как сделать большую часть этого - просто из любопытства, какой оператор "if" будет работать, чтобы вызывать ТОЛЬКО тот ордер, который был ТРИГГЕРИРОВАН. На данный момент я вызываю его, когда у меня открыт рыночный ордер, но я пытаюсь понять, как мне вызывать, когда сработал отложенный ордер?
Код ниже и соответствующий оператор "if" просто вызывают открытые отложенные ордера. Просто нужен способ "перейти" к определенной пользовательской функции (например, void) на основании того, что сработал ордер? (Если это имеет смысл!)
Спасибо, что многое прояснили для меня :)
Ахххх! Я только что провел последние 15-20 минут, размазывая отпечатки по всему месту - я начинаю понимать, где я ошибаюсь.
Легко, когда знаешь как
Думаю, теперь я знаю, как сделать большую часть этого - Просто из любопытства, какой оператор "if" будет работать, чтобы вызывать ТОЛЬКО тот ордер, который был ТРИГГЕРИРОВАН. На данный момент я вызываю его, когда у меня открыт рыночный ордер, но я пытаюсь понять, как мне вызывать, когда сработал отложенный ордер?
Когда отложенный ордер срабатывает, он становится OP_BUY или OP_SELL, так что ....
if(OrderType() == OP_BUY || OrderType() == OP_SELL) { }Один совет - используйте больше пробелов ... когда вы получаете ошибку деления на ноль и хотите найти, где это происходит, легко искать пробел/пробел и просто найти ваши деления вместо всех ваших комментариев ... поэтому я использую пробелы вокруг = + - / % и т.д.
Хороший совет - я так и сделаю! Спасибо за помощь :) Я отпишусь, если у меня получится!
Я не получаю никакой информации относительно отпечатков? Абсолютно ничего не появляется в журнале. Я предполагаю, что это происходит потому, что ничего не выбирается в качестве OrderType прямо из первого оператора "if"? Из того, что я вижу здесь в коде, я бы подумал, что я не далеко ушел, по крайней мере...?
Хорошо, я вернулся! ... Но новости не очень хорошие - я пробовал и тестировал множество вариантов кода, но безуспешно. Вот на чем я сейчас остановился.
Я не получаю никакой информации об отпечатках? Абсолютно ничего не появляется в журнале. Я предполагаю, что это происходит потому, что ничего не выбирается в качестве OrderType прямо из первого оператора "if"? Из того, что я вижу здесь в коде, я бы подумал, что я не далеко ушел, по крайней мере...?
Как вы выбираете заказ перед тем, как сделать это?
if(OrderType() == OP_BUY ){У вас все еще есть проблемы здесь
Почему бы и нет...
2013.07.31 11:13:52 2013.02.01 16:00 trendfishing_play_ground EURUSD,H1: Order Select returned the error of 0 // Not sure what is going on here? 2013.07.31 11:13:52 2013.02.01 16:00 trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000 // This is the right calculation based // upon the total lots opened on a pending order - to half. 2013.07.31 11:13:52 2013.02.01 16:00 trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000 2013.07.31 11:13:52 2013.02.01 16:00 trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000 2013.07.31 11:13:52 2013.02.01 16:00 trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This price is also correct.