Помощь в кодировании - страница 157

 
mladen:
Christoff

Таким образом, переменная Decimals должна быть в порядке

В любом случае, проверьте, какой код ошибки вы получаете в случае неудачного (частичного) закрытия ордера

Младен,

Спасибо за подсказку.

Проблема в том, что нет сообщения об ошибке. Когда он не работает, кажется, что функция PartialTP даже не была вызвана. В других случаях - обычно при первых ордерах после перезапуска советника - она работает нормально.

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

 
chrisstoff:
Младен,

Спасибо за подсказку.

Проблема в том, что нет сообщения об ошибке. Когда он не работает, кажется, что функция PartialTP даже не была вызвана. В других случаях - обычно на первых ордерах после перезапуска советника - она работает нормально.

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

chrisstoff

Извините, но с неполным кодом я не могу помочь больше.

То, что вы описываете, означает, что необходимо отладить код - а это можно сделать, только выполняя его с использованием каких-то контрольных точек.

 
mladen:
chrisstoff

Извините, но с неполным кодом я не могу помочь больше.

То, что вы описываете, означает, что необходимо отладить код - а это можно сделать, только выполняя его с использованием каких-то контрольных точек.

Спасибо, Младен.

Обнадеживает, что вы не увидели проблем в коде.

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

 
mladen:
хок87

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

Полный код для этого следующий :

int TotalOrders = 0;

for (int i=0; i <= OrdersTotal(); i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

if (OrderSymbol() == Symbol())

TotalOrders++;

}

if (TotalOrders<1)

{

ticket=OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0);

stop=(Ask-stopsize*Point);

prof=(Ask+profsize*Point);

OrderModify( ticket, OrderOpenPrice(), stop, prof, 0, Blue);

}

Malden,

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

Пример:

Баланс моего счета $500,

я хочу открыть лот размером 5%, затем он автоматически пересчитает и откроет лот $0.25, TP=10 SL=20.

Как это закодировать?

Спасибо.

 
hock87:
Malden,

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

Пример:

Баланс моего счета $500,

я хочу открыть лот размером 5%, тогда он автоматически посчитает и откроет лот $0.25, TP=10 SL=20.

Как это закодировать?

Спасибо.

Вы можете использовать для этого функцию, подобную этой:

double getLots(double stopLoss, double risk)

{

RefreshRates();

double pPoint = MarketInfo(Symbol(),MODE_POINT);

double step = MarketInfo(Symbol(),MODE_LOTSTEP);

double minLot = MarketInfo(Symbol()l,MODE_MINLOT);

double maxLot = MarketInfo(Symbol(),MODE_MAXLOT);

double lots = minLot;

if (risk>0 && stopLoss>0)

{

lots = AccountFreeMargin()*(risk/100.0)/(stopLoss*MarketInfo(s_symbol,MODE_TICKVALUE)/pPoint);

}

}

return(MathMax(MathMin(lots,maxLot),minLot));

}

PS: stopLoss должен быть передан в функцию уже в пунктах/пунктах (не в целых значениях).

 
mladen:
Вы можете использовать для этого функцию, подобную этой:
double getLots(double stopLoss, double risk)

{

RefreshRates();

double pPoint = MarketInfo(Symbol(),MODE_POINT);

double step = MarketInfo(Symbol(),MODE_LOTSTEP);

double minLot = MarketInfo(Symbol()l,MODE_MINLOT);

double maxLot = MarketInfo(Symbol(),MODE_MAXLOT);

double lots = minLot;

if (risk>0 && stopLoss>0)

{

lots = AccountFreeMargin()*(risk/100.0)/(stopLoss*MarketInfo(s_symbol,MODE_TICKVALUE)/pPoint);

}

}

return(MathMax(MathMin(lots,maxLot),minLot));

}

PS: stopLoss должен быть передан в функцию уже в пунктах/пунктах (не в целых значениях).

Спасибо, Младен.

Но у меня не получается соединить код с кодом ордера на покупку.

Появляется много ошибок и предупреждений.

Как это исправить?

Спасибо.

extern double lots = 0.1;extern double stopsize = 20;

extern double profsize = 10;

int err;

int ticket;

double stop;

double prof;

int start()

{

int TotalOrders = 0;

for (int i=0; i <= OrdersTotal(); i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

if (OrderSymbol() == Symbol())

TotalOrders++;

}

if (TotalOrders<1)

{

ticket=OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, NULL,LimeGreen);

stop=(Ask-stopsize*Point);

prof=(Ask+profsize*Point);

OrderModify( ticket, OrderOpenPrice(), stop, prof, 0, Blue);

}

err=GetLastError();

// Comment("This is a test ", err, " ", stop, " ", prof);

Comment(" ");

}
 
hock87:
Спасибо, Младен.

Но у меня не получается соединить код с кодом ордера на покупку.

Появляется много ошибок и предупреждений.

Как это исправить?

Спасибо.

extern double lots = 0.1;extern double stopsize = 20;

extern double profsize = 10;

int err;

int ticket;

double stop;

double prof;

int start()

{

int TotalOrders = 0;

for (int i=0; i <= OrdersTotal(); i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

if (OrderSymbol() == Symbol())

TotalOrders++;

}

if (TotalOrders<1)

{

ticket=OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, NULL,LimeGreen);

stop=(Ask-stopsize*Point);

prof=(Ask+profsize*Point);

OrderModify( ticket, OrderOpenPrice(), stop, prof, 0, Blue);

}

err=GetLastError();

// Comment("This is a test ", err, " ", stop, " ", prof);

Comment(" ");

}

Попробуйте так (я проверил это сейчас и это работает):

extern double lots = 0.1;extern double stopsize = 20;

extern double profsize = 10;

int err;

int ticket;

double stop;

double prof;

int init() { return(0); }

int deinit() { return(0); }

int start()

{

int TotalOrders = 0;

for (int i=0; i <= OrdersTotal(); i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

if (OrderSymbol() == Symbol())

TotalOrders++;

}

if (TotalOrders<1)

{

ticket=OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, NULL,LimeGreen);

stop=(Ask-stopsize*Point*MathPow(10,Digits%2));

prof=(Ask+profsize*Point*MathPow(10,Digits%2));

OrderModify( ticket, OrderOpenPrice(), stop, prof, 0, Blue);

}

err=GetLastError();

// Comment("This is a test ", err, " ", stop, " ", prof);

Comment(" ");

}
Файлы:
_test_1.mq4  1 kb
test_1.gif  78 kb
 

уважаемые mladen и mr. tools, пожалуйста,

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

например

Я хочу, чтобы ea подавала сигнал на покупку:

ema 8 пересекает ema 21

qqe выше 0

не запаздывающая ma зеленая

и свеча находится выше облака ишимоку.

советник не должен открывать сделки, а только подавать сигнал при выполнении указанных условий

 

Спасибо, Младен.

Я попробовал.

но он все равно открывает лоты с $0.1.

Я хочуоткрывать лоты в размере процента от баланса моего счета.

Например: баланс счета $500.

открываем лот размером 5%, затем он автоматически пересчитывает и открывает лоты по $0.25, TP=10 SL=20.

LotSizeSlot1 = AccountBalance() * (RiskSlot1 / 100)

LotSizeSlot1 = $500*(5%/100)

LotSizeSlot1 = $ 0.25

Затем он автоматически открывает лоты по $0.25 и TP=10 SL=20.

Как это создать?

Спасибо.

 
hock87:
Спасибо, Младен.

Я пробовал.

но он все равно открывает лоты с $0.1.

Я хочу открытьлот в размере процента от баланса моего счета.

Например: баланс счета $500.

открываю лот размером 5%, затем он автоматически пересчитывает и открывает лоты по $0.25, TP=10 SL=20.

LotSizeSlot1 = AccountBalance() * (RiskSlot1 / 100)

LotSizeSlot1 = $500*(5%/100)

LotSizeSlot1 = $ 0.25

Затем он автоматически открывает лоты по $0.25 и TP=10 SL=20.

Как это создать?

Спасибо.

Как в приложенном примере.

Файлы:
_test_2.mq4  2 kb
Причина обращения: