Основные вопросы ... - страница 8

 

Посмотрите на эту тему: https://www.mql5.com/en/forum/178677

 
newdigital:
Посмотрите эту тему: https://www.mql5.com/en/forum/178677

большое спасибо, за инструкцию по открытию файла и ссылку на скачивание.

 

10points3

ПЛИАААСИ, ПРОГРАММИСТЫ!

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

на самом деле у нас есть:

if (PreviousOpenOrders>OpenOrders)

{

for(cnt=OrdersTotal();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

mode=OrderType();

if (OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)

{

if (mode==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Blue); }

if (mode==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Red); }

return(0);

}

Я думал сделать следующее:

1. при открытии второй сделки изменить магическое число для первой сделки, например magicnumber+1

2. когда открывается третья сделка, закрываем первую, с присвоенным magicnumber+1.

Я прав?

Или каким другим способом я могу определить первую открытую сделку, чтобы закрыть ее позже?

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

Это изменение было бы началом Голли Грааля!!!

 

10 пунктов3

Извините, советник.

Он находится в этой теме:

https://www.mql5.com/en/forum/174975

Спасибо!

Файлы:
10p3v0.03_1.mq4  12 kb
 

помощь в программировании - оператор возврата

здравствуйте

Я начинающий программист в mt4 и сейчас часто пытаюсь найти решение для фиксации переменных из функции void в основной программе "start()".

ниже вы можете увидеть пример и вопрос в том, как я могу зафиксировать значение переменных "CountOpenSell", "CountOpenBuy", "ProfitSell" и "ProfitBuy" в start() - mainprogram..........

Я добавил свое предложение (return`ы выделены жирным шрифтом), но я не знаю, правильно ли это и как правильно написать код для основной программы "start()"?

Извините за мой плохой английский и за помощь

большое спасибо

с уважением

forex2006

void CallBuySellProfit()

{ ProfitBuy=0;

ProfitSell=0;

CountOpenSell=0;

CountOpenBuy=0;

for (i=OrdersTotal()-1;i>=0;i--)

{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

if (OrderType()==OP_SELL) {ProfitSell = ProfitSell + OrderProfit();CountOpenSell++;}

if (OrderType()==OP_BUY) {ProfitBuy = ProfitBuy + OrderProfit();CountOpenBuy++;}

}

else Print("Ошибка при выборе ордера ", GetLastError());

}

return(CountOpenSell);

return(CountOpenBuy);

return(ProfitSell);

return(ProfitBuy);

}

 

помощь в программировании forex2006 - оператор return

Привет, forex2006,

Если вы действительно хотите изучить mql, я бы посоветовал вам попробовать учебники от codersguru, именно с них я начинал. Что касается вашего вопроса, функция void не может вернуть значение, если вы хотите получить значения из функций void, вы должны использовать глобальные переменные. Лучший способ получить значения - использовать функцию, которая возвращает значение, используя параметры, указывающие, какие значения вы хотите получить. Ниже приведен простой пример. Старайтесь избегать использования глобальных переменных в функциях, так как это может затруднить вашу дальнейшую работу.

Надеюсь, это поможет

int start()

{

double ProfitBuy = CallBuySellProfit(OP_BUY,false);

double ProfitSell = CallBuySellProfit(OP_SELL,false);

int CountOpenBuy = CallBuySellProfit(OP_BUY,true);

int CountOpenSell = CallBuySellProfit(OP_SELL,true);

Comment("ProfitBuy: "+DoubleToStr(ProfitBuy,2) +"\n "+

"ProfitSell: "+DoubleToStr(ProfitSell,2) +"\n "+

"CountOpenBuy: "+DoubleToStr(CountOpenBuy,2)+"\n "+

"CountOpenSell: "+DoubleToStr(CountOpenSell,2)+"\n "+

"");

return;

}

double CallBuySellProfit(int iOrderType, bool bCount)

{

double dProfit = 0;

int iCount = 0;

for (int i=OrdersTotal()-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

if(OrderType()==iOrderType)

{

dProfit = dProfit + OrderProfit();

iCount++;

}

}

else

{

Print("Ошибка при выборе заказа ", GetLastError());

}

}//end for

if(bCount)return(iCount);

else return(dProfit);

}//end CallBuySellProfit

 

Остановить торговлю советника на одном и том же баре

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

Спасибо

 

matrixebiz, рассматривали ли вы возможность открытия и закрытия сделки на одной и той же свече до того, как свеча закрылась? возможно, вам также следует проверить список истории.

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

bool DecideToOpenTrade()

{

int total = OrdersTotal();

if (total > 0)

{

for(int cnt=0;cnt<total;cnt++)

{

if(OrderSelect(cnt,SELECT_BY_POS))

{

if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)

{

return (false);

}

}

}

}

// in case trades has already opened and closed within the candle

int histotal = OrdersHistoryTotal();

if (histotal > 0)

{

for(cnt=0;cnt<histotal;cnt++)

{

if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))

{

if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)

{

if (Time[0] <= OrderOpenTime()) // don't open a new position if we're still on the same candle

{

return (false);

}

}

}

}

}

return (true);

}

int start()

{

// some time check codes first.. blah blah

// ...

// ...

// ...

// check signals

if (Should_Buy())

{

if (DecideToOpenTrade())

{

//... trade opening codes here

}

}

if (Should_Sell())

{

if (DecideToOpenTrade())

{

//... trade opening codes here

}

}

}

Примечание: эта функция предполагает, что вы установили уникальное значение EA_MAGIC_NUM. Таким образом, проверка не будет просматривать сделки, открытые другими советниками.

Should_Buy() и Should_Sell() - это функции, которые я создаю во всех своих советниках, чтобы определить, произошел ли сигнал на покупку или продажу.

Надеюсь, это поможет. Напишите мне, если вам нужны дополнительные разъяснения.

с уважением,

Zen

 

обновленный пост ниже...

 

Кажется, это работает для меня Спасибо.

void DesideToOpen()

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

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

{

int total = OrdersTotal();

if (total > 0)

{

for(int cnt=0;cnt<total;cnt++)

{

if(OrderSelect(cnt,SELECT_BY_POS))

{

if(OrderComment() == EA_Name + MagicNumber) DecideToOpenTrade = false;

}

}

}

// in case trades has already opened and closed within the candle

int histotal = OrdersHistoryTotal();

if (histotal > 0)

{

for(cnt=0;cnt<histotal;cnt++)

{

if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))

{

if(OrderComment() == EA_Name + MagicNumber)

{

if (Time[0] <= OrderOpenTime()) DecideToOpenTrade = false; // don't open a new position if we're still on the same candle

}

}

}

}

}