//+------------------------------------------------------------------+//| подготовить массив тикетов для закрытия |//+------------------------------------------------------------------+void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9])
{
int size=ArrayRange(arrayTickets,0);
//----if (size==0) return;
int i,type,ticket,closeSize;
for (i=0;i<size;i++)
{
type=arrayTickets[i][1];
// если тип ордера не рыночный, то пропускаемif (type>OP_SELL) continue;
if (Revers) // перевернем тип рыночного ордера
{
if (type==OP_BUY) type=OP_SELL; else type=OP_BUY;
}
// тут решаем для каждого открытого ордера его судьбу// оставить в рынке или добавить в массив на закрытиеif (type==OP_BUY)
{
//// код разрешающий оставить покупку// как примерif (signal==OP_BUY) continue;
}
if (type==OP_SELL)
{
//// код разрешающий оставить продажу// как примерif (signal==OP_SELL) continue;
}
closeSize=ArrayRange(ticketsClose,0);
ArrayResize(ticketsClose,closeSize+1);
ArrayResize(lots,closeSize+1);
ticketsClose[closeSize][0] = arrayTickets[i][0]; // # тикета
ticketsClose[closeSize][1] = arrayTickets[i][1]; // тип ордера// здесь укажем сколько лотов нужно закрыть
lots[closeSize] = arrayTickets[i][2]; // закрываемый объем// можно закрывать частично, тогда нужно переписать строку сверху
}
//----return;
}
//+------------------------------------------------------------------+//| Закрывает ордера с указанными тикетами |//+------------------------------------------------------------------+void CloseMarketOrders(int ticketsArray[][2], double lotsArray[])
{
//----int i,size=ArrayRange(ticketsArray,0);
if (size==0) return;
int ticket,type;
double lots;
bool res;
int total=OrdersTotal();
for (i=0;i<size;i++)
{
ticket = ticketsArray[i][0];
type = ticketsArray[i][1];
lots = lotsArray[i];
RefreshRates(); // на всякий случай обновим сведения о рыночном окружении// блок закрытия покупокif (type==OP_BUY)
{
res = OrderClose(ticket,lots,Bid,Slippage,Orange);
if (!res)
{
Print("Не удалось закрыть ордер в покупку #",ticket,"! Ошибка №",GetLastError());
// дальнейшая обработка ошибки, написать самостоятельно
}
}
// блок закрытия продажif (type==OP_SELL)
{
res = OrderClose(ticket,lots,Ask,Slippage,Orange);
if (!res)
{
Print("Не удалось закрыть ордер в продажу #",ticket,"! Ошибка №",GetLastError());
// дальнейшая обработка ошибки, написать самостоятельно
}
}
}
//----return;
}
//========================================================================================================================// Закрытие открытых позиций на продажу //-------------------------------------------------------------------------------------------------------------------------if(ExistPositions(NULL, OP_SELL, Magic, 0) == true) //если открыта позиция sell
{
if() // условие на закритие
{
ClosePosFirstProfit(NULL, OP_SELL, Magic); //закрываем позицию
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 06.03.2008 |//| Описание : Возвращает флаг существования позиций |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| ot - время открытия ( 0 - любое время открытия) |//+----------------------------------------------------------------------------+bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (ot<=OrderOpenTime()) return(True);
}
}
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание: Закрытие одной предварительно выбранной позиции |//+----------------------------------------------------------------------------+void ClosePosBySelect() {
bool fc;
color clClose;
double ll, pa, pb, pp;
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), err, it;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) //break;while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType()==OP_BUY) {
pp=pb; clClose=clCloseBuy;
} else {
pp=pa; clClose=clCloseSell;
}
ll=OrderLots();
pp=NormalizeDouble(pp, dg);
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
if (fc) {
if (UseSound) PlaySound(SoundSuccess); //break;
} else {
err=GetLastError();
if (UseSound) PlaySound(SoundError);
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Sleep(1000*5);
}
}
} elsePrint("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Закрытие позиций по рыночной цене сначала прибыльных |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
// Сначала закрываем прибыльные позицииfor (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderProfit()+OrderCommission()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
}
// Потом все остальные
k=OrdersTotal();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
}
}
}
}
}
EAを1つのフォルダに収納するのではなく、フォルダにまとめることは可能なのでしょうか...❔?
そして、このフォルダーからも仕事をすること。
あるEAを20バージョン、別のEAを20バージョン持っているのですが、ファイル一式を解除するのは不可能です。
こんにちは。
検索しても出てこない。
もしかしたら、同じような脚本を見た人がいるかもしれない。
ポイント:スクリプトで指定するのは、シンボル、買い/売り、ボリューム
は5-7個あるはずです。
複数のシンボルで同時にオープンする場合、そのボリュームは0に等しくない。
ありがとうございました。
敬具
問題があって、どうすれば解決できるのか見当もつかないので、説明します。
つまり、私が投稿したコードでは、2つの関数があります。
void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9]) に、注文を残すか閉じるかを決定する条件を入れなければならない。
条件をつけてみたが、何も効果がない...。
どなたか、これらの関数にエラーがあるのか、あるいは私が失敗したのか、ご確認ください。
こんにちは。
検索しても出てこない。
もしかしたら、同じような脚本を見た人がいるかもしれない。
ポイント:スクリプトで指定するのは、シンボル、買い/売り、ボリューム
は、5-7個のフィールドがあるはずです。
複数のシンボルで同時にオープンする場合、そのボリュームは0に等しくない。
ありがとうございました。
敬具
とんでもない言葉遣いですね。質問者が求めているものは...
こんにちは。質問があるのですが...。ストキャスティクスによるエントリー(5,14,3)同じくストキャスティクスによるエグジットだが、別の期間(5,3,3)を持つ。ストキャスティクスを出口に使って、リターンのシグナルは使わないというのはどうなんでしょう。
問題があって、どうすれば解決できるのか見当もつかないので、説明します。
私が書いたコードでは、2つの関数があります。
void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9]) に、注文を残すか閉じるかを決定する条件を入れる必要があります...。
条件をつけてみたが、何も効果がない...。
どなたか、これらの関数に間違いがないか、あるいは私が失敗していないか、見てください。
もしかしたら、参考になるかもしれません。あなたのコードを見たわけではありません。
キムの機能
こんにちは。質問があるのですが...。ストキャスでエントリーして(5,14,3)、ストキャスのみで別の期間(5,3,3)でエグジットしています。ストキャスティクスを出口に使って、リターンのシグナルは使わないというのは理解できません。 。
私なら、クローズするチケットの配列を 作らず、成行注文の 列挙ループで、可能な条件をチェックしながら、チケットをクローズ関数の入力に送り、各注文のチェックを します。
入札はどの時点でも0にできるのか?
文言がとても良い。質問者が求めているものは...
あるシンボルの売りを2回目の買いで同時にオープンするスクリプトがあります。
私は、現在の価格で、各シンボルに指定されたボリュームで、7-10シンボルの売り/買いを同時に開くことができるスクリプトに興味を持っています。
例
売り EURUSD 1
GBPUSD 1.5を買う
売り USDCAD 1.2
AUDUSD 1.1買い
NZDUSDの買い 2
USDCHFの買い 3
MultiOrders スクリプトはほぼ完璧ですが、シンボルのフィールドが5つあるのが残念です。
あるシンボルの売りを2回目の買いで同時にオープンするスクリプトがあります。
私は、現在の価格で、各シンボルに指定されたボリュームで、7-10シンボルの売り/買いを同時に開くことができるスクリプトに興味を持っています。
例
売り EURUSD 1
GBPUSD 1.5を買う
売り USDCAD 1.2
AUDUSD 1.1買い
NZDUSDの買い 2
USDCHFの買い 3
MultiOrders スクリプトはほぼ完璧ですが、シンボルのフィールドが5つあるのが残念です。