포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 1096

 
abeiks :

안녕하세요!

TP 포지션이 마감되었는지 어떻게 알 수 있습니까? 나는 OrderClosePrice()==OrderTakeProfit() 이 사용 하는 올바른 방법이라고 생각하지 않습니다.

주문 댓글에서 [tp]를 검색하세요...

 
AlexeyVik :

주문 댓글에서 [tp]를 검색하세요...


고맙습니다.
 

안녕하세요 프로입니다.

오류 수정을 도와주세요...

표시기가 작동 중입니다.

신호는 0번째 막대에서 트리거됩니다.

그러나 다른 틱이 현재 막대에 도착하면 다시 시작되고 새로운 신호를 제공합니다.

매도 또는 매수 이벤트가 발생하면 원 안의 이 신호가 이벤트의 현재 가격 위치에 놓이고 이 열린 막대에서 더 이상 이벤트가 처리되지 않아야 합니다.

새로운 신호와 원이 이 막대에 있으면 안 됩니다.

_____________________________________

당신이 이것이 완전한 넌센스, 잘못된 신호 등이라고 말할 것이라는 것을 이해하지만 저는 그렇게 필요합니다.

깃발, 라벨 등을 만들어야 한다는 것을 알고 있습니다. 하지만 언어를 스스로 공부할 시간이 없습니다.

__________________________________________

첨부파일에 이런 플래그를 추가해 주시면 추가 된 라인 을 색으로 표시해주시면 정말 감사하겠습니다.....

감사합니다. 누군가가 답변을 해주기를 바랍니다.

파일:
 
alvlaf :

그것은 몇 가지 오류를 제공, 그것은 그것을 고칠 수 없습니다. 여기서 무슨 문제가 있습니까?

//+----------------------------------------------- --------------------+
//| BB1.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+----------------------------------------------- --------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#속성 링크 "https://www.mql5.com"
#속성 버전 "1.00"
#속성엄격

extern 이중 로트 = 1; // 많은
외부 intExp = 1; // 만료
extern int 대기 = 2; // 한 방향의 촛불 개수
extern int 시간 초과 = 1; // 시간 간격
extern 이중 승수 = 3; // 승수
extern int 미끄러짐 = 5; // 미끄러짐
extern int 매직 = 774274; // 마법
외부 정수 MaxOpenOrders = 1; // 최대 주문 수

int 티켓, 유형, SymbolCount;
두 배 가격, 많은;

입력 문자열 TradeSymbols = "EURUSD_OP, GBPUSD_OP, AUDUSD_OP, NZDUSD_OP, USDCAD_OP, USDCHF_OP, GBPCAD_OP, AUDNZD_OP, CHFJPY_OP, GBPCHF_OP"; // 트레이딩 심볼

문자열 기호[50]; // 50은 가능한 최대 문자 수입니다.


//------------------------------------------------ --

int OnInit()

{

if (IsTesting() || !ExtractSymbols())

{

SymbolCount = 1;

기호[0] = 기호();

}

반환(INIT_SUCCESSED);

}

//------------------------------------------------ --

bool ExtractSymbols()

{

짧은 쉼표 = StringGetCharacter(",", 0);

SymbolCount = StringSplit(TradeSymbols, 쉼표, 기호);

for (int i = 0, i < SymbolCount, i++)

{

StringToUpper(심볼[i]);

기호[i] = StringTrimRight(기호[i]); // 임의의 공백으로부터 보호

기호[i] = StringTrimLeft(기호[i]);

}

if (SymbolCount > 0) return(true);

반환(거짓);

}

//------------------------------------------------ --

무효 OnTick()

{

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

{

if (CountTrades() == 0) // 주문 수는 0과 같아야 합니다.

{

if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY)) ||

(TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))) && MaxOpenOrders > OrdersTotal())

// 마지막 거래가 수익성이 없으면 같은 거래가 열리지만 로트가 증가합니다.

{

유형 = TypeLastHistOrder();

if (유형 == OP_BUY) 가격 = LastAsk;

if (유형 == OP_SELL) 가격 = LastBid;

로트 = NormalizeDouble(LotsLastHistOrder()*승수, 2);

티켓 = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0 && MaxOpenOrders > OrdersTotal())

// 마지막 거래의 이익이 0이면 동일하게 엽니다.

{

유형 = TypeLastHistOrder();

if (유형 == OP_BUY) 가격 = LastAsk;

if (유형 == OP_SELL) 가격 = LastBid;

많은 = NormalizeDouble(LotsLastHistOrder(), 2);

티켓 = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

|| CountHistTrades() == 0)// 마지막 거래가 수익성이 있으면 주문이 열립니다.

{

if (SignalBuy(Symbols[i]) && MaxOpenOrders > OrdersTotal())

{

티켓 = OrderSend(Symbols[i], OP_BUY, lot, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (SignalSell(Symbols[i]) && MaxOpenOrders > OrdersTotal())

{

티켓 = OrderSend(Symbols[i], OP_SELL, lot, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

}

}

}

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

int CountTrades(int 유형 = -1)

{

정수 cnt = 0;

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

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))

cnt++;

}

}

리턴(cnt);

}

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

int CountHistTrades(int 유형 = -1)

{

정수 cnt = 0;

(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))

cnt++;

}

}

리턴(cnt);

}

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

bool SignalBuy(stringSym)

{

for (int i=1; i<=대기; i++)

{

더블 C = iClose(Sym, PERIOD_M5, i); // 여기에 원하는 시간 프레임을 지정합니다.

이중 O = iOpen(Sym, PERIOD_M5, i);

if (C > O) return(거짓);

}

if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= 대기 || (대기 == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

반환(거짓);

}

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

bool SignalSell(stringSym)

{

for (int i=1; i<=대기; i++)

{

더블 C = iClose(Sym, PERIOD_M5, i); // 여기에 원하는 시간 프레임을 지정합니다.

이중 O = iOpen(Sym, PERIOD_M5, i);

if (C < O) return(거짓);

}

if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= 대기 || (대기 == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

반환(거짓);

}

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

날짜/시간 TimeLastHistOrder(int 유형 = -1)

{

날짜 시간 마지막 시간 = 0;

날짜 시간 오픈 시간 = 0;

(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))

{

if (OrderCloseTime() > 마지막 시간)

{

마지막 시간 = OrderCloseTime();

오픈타임 = 주문오픈타임();

}

}

}

}

반환(오픈 시간);

}

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

intTypeLastHistOrder()

{

날짜 시간 = 0;

정수 유형 = -1;

(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderMagicNumber() == 매직)

{

if (OrderCloseTime() > 시간)

{

시간 = OrderCloseTime();

유형 = 주문 유형();

}

}

}

}

반환(유형);

}

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

이중 LotLastHistOrder(int 유형 = -1)

{

날짜 시간 = 0;

이중 로트 = 0;

(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))

{

if (OrderOpenTime() > 시간)

{

시간 = OrderOpenTime();

제비 = OrderLots();

}

}

}

}

반환(많은);

}

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

두 배 PriceCloseLastHistOrder(int 유형 = -1)

{

날짜 시간 = 0;

이중 가격 = 0;

(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))

{

if (OrderCloseTime() > 시간)

{

시간 = OrderCloseTime();

가격 = OrderClosePrice();

}

}

}

}

반품(가격);

}

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

두 배 PriceOpenLastHistOrder(int 유형 = -1)

{

날짜 시간 = 0;

이중 가격 = 0;

(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))

{

if (OrderCloseTime() > 시간)

{

시간 = OrderCloseTime();

가격 = OrderOpenPrice();

}

}

}

}

반품(가격);

}

Alexander, 이전과 같이 두 개의 다른 악기를 여는 것 외에도 그는 여전히 동일한 악기에 대해 여러 위치를 동시에 열 수 있는 관리를 이전보다 훨씬 더 나빠졌습니다. 어딘가 우리는 너무 똑똑합니다.
 

뉴스 거래를 도와주세요. 우리는 두 가지 주요 기능을 가져야 하는 어드바이저가 정말로 필요합니다.

첫 번째 기능: 주어진 가격에서 주어진 수준에서 주어진 시간에 주어진 TP 및 SL로 보류 주문 을 배치합니다.
두 번째 기능: 절감액을 가격과 평행하게 유지합니다. 즉, 가격과 함께 이동하십시오(손으로 하는 것은 너무 끔찍합니다). 그리고 주어진 시간에 뉴스 릴리스 중에 이 작업을 중지하고 가격이 주문 중 하나에 도달할 때까지 기다립니다. 이후 2번째 주문은 즉시 삭제됩니다.

다시:
뉴스 2분 전, 가격에서 10포인트 떨어진 곳에 두 개의 반대 스탑 오더가 배치되고, 가격과 평행하게 이동하는 기능이 즉시 활성화되고, 2분 동안 가격과 함께 이동하고, 하나의 주문이 가격에서 멀어집니다. , 두 번째는 가격을 따라잡습니다. 뉴스가 공개되는 동안 보류 중인 이동 기능을 끄고 주문 중 하나의 고장을 기다립니다. 첫 번째 고장 후 두 번째는 즉시 제거됩니다.

EA 속성에서 변경할 수 있는 변수

TP - 600(기본값)

Trall - 300(기본값)

SL - 100(기본값)

핍 - 100(기본 가격과의 거리)

미끄러짐 - 100(기본적으로 핍 단위의 미끄러짐)

로트 - 0.1

위험 - 10 // 퍼센트(글쎄요, 이것은 필요하지 않습니다. 나중에 질문하겠습니다)

TimeNews1On - true(아래 셀을 사용하여 시간을 입력하고 false - EA에서 거래하지 않음)

TimeNewsHour - 시간(뉴스 릴리스 시간 1)

TimeNewsMin - 분(보도 발표 시간 1)

TimeNews2On - false(기본값)

TimeNewsHour - 시간(뉴스 릴리스 시간 2)

TimeNewsMin - 분(보도 발표 시간 2)

TimeNews3On - 거짓

TimeNewsHour - 시간(뉴스 릴리스 시간 3)

TimeNewsMin - 분(보도 발표 시간 3)

TimeNews4On - 거짓

TimeNewsHour - 시간(뉴스 릴리스 시간 4)

TimeNewsMin - 분(보도 발표 시간 4)

TimeNews5On - 거짓

TimeNewsHour - 시간(뉴스 릴리스 시간 5)

TimeNewsMin - 분(뉴스 릴리스 시간 5)


인스타, 파이브사인


나는이 모든 것을 수동으로 수행합니다. 그것은 잡다한 일이며 이제는 뉴스를 해결할 시간이 없습니다. 나는 고문을 아침이나 밤에 쌍으로 만들고 싶습니다. 그날 뉴스가있을 곳에서 그들이 모두 일할 수 있도록 밖으로.
--------------------------------------

그런 고문을 알고 있다면 만나서 공유하십시오

미리 감사합니다!

 
alvlaf :

원래 코드로 돌아가자. 다음과 같이 시도하십시오.

int OnInit()

{

if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);

반환(INIT_SUCCESSED);

}

무효 OnDeInit()

{

GlobalVariableSet("AllowNewOrders",1);

}

무효 OnTick()

{

if (CountTrades() == 0) // 주문 수는 0과 같아야 합니다.

{

if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))

// 마지막 거래가 수익성이 없으면 같은 거래가 열리지만 로트가 증가합니다.

{

GlobalVariableSet("AllowNewOrders", 0);

유형 = TypeLastHistOrder();

if (유형 == OP_BUY) 가격 = 묻기;

if (유형 == OP_SELL) 가격 = 입찰가;

로트 = NormalizeDouble(LotsLastHistOrder()*승수, 2);

티켓 = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)

// 마지막 거래의 이익이 0이면 동일하게 엽니다.

{

GlobalVariableSet("AllowNewOrders", 0);

유형 = TypeLastHistOrder();

if (유형 == OP_BUY) 가격 = 묻기;

if (유형 == OP_SELL) 가격 = 입찰가;

많은 = NormalizeDouble(LotsLastHistOrder(), 2);

티켓 = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

|| CountHistTrades() == 0)// 마지막 거래가 수익성이 있으면 주문이 열립니다.

{

if (GlobalVariableGet("AllowNewOrders") > 0) 반환;

if (SignalBuy() && MaxOpenOrders > OrdersTotal())

{

티켓 = OrderSend(Symbol(), OP_BUY, lot, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

if (티켓>0) GlobalVariableSet("AllowNewOrders", 0);

}

if (SignalSell() && MaxOpenOrders > OrdersTotal())

{

티켓 = OrderSend(Symbol(), OP_SELL, 랏, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

if (티켓>0) GlobalVariableSet("AllowNewOrders", 0);

}

}

}

}

나는 그것을 확인하지 않았습니다. 왜냐하면 총 1개의 주문 제한이 있는 어드바이저의 여러 사본이 어떤 심볼(수익성 시리즈 이후)이 거래를 시작하는 것이 더 나은지 결정하는 방법을 이해하지 못하기 때문입니다.

 
BooGUY :


뉴스 거래를 도와주세요. 우리는 두 가지 주요 기능을 가져야 하는 어드바이저가 정말로 필요합니다.

첫 번째 기능: 주어진 가격에서 주어진 수준에서 주어진 시간에 주어진 TP 및 SL로 보류 주문 을 배치합니다.
두 번째 기능: 절감액을 가격과 평행하게 유지합니다. 즉, 가격과 함께 이동하십시오(손으로 하는 것이 너무 끔찍합니다). 그리고 주어진 시간에 뉴스 릴리스 중에 이 작업을 중지하고 가격이 주문 중 하나에 도달할 때까지 기다립니다. 이후 2번째 주문은 즉시 삭제됩니다.

다시:
뉴스 2분 전, 가격에서 10포인트 떨어진 곳에 두 개의 반대 스탑 오더가 배치되고, 가격과 평행하게 이동하는 기능이 즉시 활성화되고, 2분 동안 가격과 함께 이동하고, 하나의 주문이 가격에서 멀어집니다. , 두 번째는 가격을 따라잡습니다. 뉴스가 공개되는 동안 보류 중인 이동 기능을 끄고 주문 중 하나가 고장날 때까지 기다립니다. 첫 번째 고장 후 두 번째는 즉시 제거됩니다.

그런 고문을 알고 있다면 만나서 공유하십시오


미리 감사합니다!

파일에서 뉴스 데이터를 읽기 위한 코드를 보내드릴 수 있습니다. 유용할 것입니다. 일주일에 한 번 경제 달력을보고주의해야 할 뉴스의 폴더_with_terminal\MQL4\Files\novosti.txt에 데이터를 입력하면 뉴스 직전에도 고문을 켤 수 있습니다 (추적 할 수 있습니다 예를 들어 그러한 고문과의 미국 세션의 시작 - 갑자기 강한 움직임이있을 것입니다). 거래 측면에서 코드는 아직 확정되지 않았습니다. 두 번이나 뉴스에서 심각하게 "던져버렸기" 때문입니다. 다른 이익을 취하는... 일반적으로 뉴스 코드가 작동하지만 거래 코드를 개선해야 합니다.

#속성엄격

입력 문자열 NewsFilename = "novosti.txt"; // 뉴스가 있는 텍스트 파일의 이름

입력 int MinutesBefore = 5; // 뉴스 발표까지 몇 분 전에 주문

입력 int MinutesAfter1 = 15; // 1군 주문 삭제 소식이 나온 후 몇 분

입력 int MinutesAfter2 = 30; // 뉴스가 나온 후 2군 주문을 삭제하기까지 몇 분

입력 int MinutesAfter3 = 30; // 뉴스가 나온 후 몇 분 후에 3군 주문을 삭제

입력 정수 PriceIndent1 = 15; // 가격에서 오프셋(포인트)

입력 정수 PriceIndent2 = 5; // 이전 테이크 이익에서 들여쓰기(포인트)

입력 정수 TakeProfit1 = 40; // 1그룹의 이익실현 크기(포인트)

입력 정수 TakeProfit2 = 60; // 그룹 2의 이익실현 크기(포인트)

입력 정수 TakeProfit3 = 100; // 세 번째 그룹의 이익실현 크기(포인트)

입력 정수 StopLoss = 20; // 포인트 단위의 모든 주문에 대한 손절매 크기

입력 이중 승수1 = 1.0; // 두 번째 그룹의 주문 로트에 대한 계수

입력 더블 Multiplier2 = 2.0; // 3번째 그룹의 주문 개수에 대한 계수

입력 정수 최대 위험 = 10; // 최대 위험(%)

//================================================== ====================================================

날짜 시간 시간[200], 마지막 시간;

문자열 기호[200];

bool 뉴스 통과[200];

int 뉴스 수;

//================================================== ====================================================

int OnInit()

{

// 최신 뉴스 로드

if (!LoadNews()) return(INIT_FAILED);

반환(INIT_SUCCESSED);

}

//================================================== ====================================================

무효 OnTick()

{

if (!IsTradeAllowed()) 반환;

날짜 시간 테스트 시간 = iTime(Symbol(), PERIOD_H1, 0);

// 매일 시작하는 뉴스 업데이트

if (TimeDay(TestTime) != TimeDay(LastTime))

{

마지막 시간 = 테스트 시간;

만약 (!LoadNews())

{

Alert("뉴스 업데이트 실패!");

반품;

}

}

//------------------------------------------------ --------------------------------------------------

for (int i = 0, i < NewsCount, i++)

{

// 뉴스 릴리스 전에 브레이크 아웃 주문을 하십시오.

if (Times[i] > TimeCurrent() && Times[i] - TimeCurrent() <= MinutesBefore * 60 && !NewsPassed[i])

{

PrintFormat("현재 시간 - %s, 통화별 주문 시간 - %s", TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES), Symbols[i]);

SetupOrders(Symbols[i]);

NewsPassed[i] = 참;

}

}

//------------------------------------------------ --------------------------------------------------

}

//================================================== ====================================================

bool LoadNews()

{

정수 개수, 눈금 = 0;

문자열 Str, 데이터[40];

재설정 마지막 오류();

if (!FileIsExist(뉴스파일이름, 0))

{

PrintFormat("뉴스 파일 %s이(가) 존재하지 않습니다.", NewsFilename);

Print("파일은 테스트하는 동안 \\MQL4\\Files 폴더에 있어야 합니다. - \\Tester\\Files 폴더에 있습니다.");

반환(거짓);

}

int 핸들 = FileOpen(뉴스파일명, FILE_READ|FILE_SHARE_READ|FILE_TXT);

if (핸들 != INVALID_HANDLE)

{

동안 (!FileIsEnding(핸들))

{

Str = FileReadString(핸들);

개수 = StringSplit(Str, StringGetChar(" ", 0), 데이터);

for (int i = 1, i < 개수, i = i + 2)

{

시간[틱] = StringToTime(데이터[0] + " " + 데이터[i]);

기호[틱] = 데이터[i + 1];

틱++;

}

}

파일닫기(핸들);

NewsCount = 틱;

for (int i = 0, i < NewsCount, i++)

{

if (Times[i] > TimeCurrent()) NewsPassed[i] = false;

그렇지 않으면 NewsPassed[i] = 거짓;

}

PrintFormat("로드된 뉴스 수 - %i.", NewsCount);

반환(참);

}

PrintFormat("%s 파일을 열 수 없습니다. 오류 코드 %d.", NewsFilename, GetLastError());

반환(거짓);

}

//================================================== ====================================================

무효 SetupOrders(stringSym)

{

int 티켓, 발굴, 개수;

이중 가격, TP, SL, 로트;

날짜 시간 KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;

문자열 SymList[7];

//------------------------------------------------ --------------------------------------------------

if (심 == "AUD")

{

SymList[0] = "AUDCAD"; SymList[1] = "AUDCHF"; SymList[2] = "AUDJPY"; SymList[3] = "AUDNZD";

SymList[4] = "USDUSD"; SymList[5] = "유로"; SymList[6] = "GBPAUD";

}

//------------------------------------------------ --------------------------------------------------

if (심 == "CAD")

{

SymList[0] = "AUDCAD"; SymList[1] = "CADCHF"; SymList[2] = "CADJPY"; SymList[3] = "EURCAD";

SymList[4] = "GBPCAD"; SymList[5] = "NZDCAD"; SymList[6] = "USDCAD";

}

//------------------------------------------------ --------------------------------------------------

if (심 == "CHF")

{

SymList[0] = "AUDCHF"; SymList[1] = "CADCHF"; SymList[2] = "EURCHF"; SymList[3] = "GBPCHF";

SymList[4] = "CHFJPY"; SymList[5] = "NZDCHF"; SymList[6] = "USDCHF";

}

//------------------------------------------------ --------------------------------------------------

if (Sym == "EUR")

{

SymList[0] = "유로"; SymList[1] = "유로캐드"; SymList[2] = "EURCHF"; SymList[3] = "EURGBP";

SymList[4] = "EURJPY"; SymList[5] = "EURNZD"; SymList[6] = "EURUSD";

}

//------------------------------------------------ --------------------------------------------------

if (심 == "GBP")

{

SymList[0] = "EURGBP"; SymList[1] = "GBPAUD"; SymList[2] = "GBPCAD"; SymList[3] = "GBPCHF";

SymList[4] = "GBPJPY"; SymList[5] = "GBPNZD"; SymList[6] = "GBPUSD";

}

//------------------------------------------------ --------------------------------------------------

if (Sym == "JPY")

{

SymList[0] = "AUDJPY"; SymList[1] = "CADJPY"; SymList[2] = "CHFJPY"; SymList[3] = "EURJPY";

SymList[4] = "GBPJPY"; SymList[5] = "NZDJPY"; SymList[6] = "USDJPY";

}

//------------------------------------------------ --------------------------------------------------

if (심 == "NZD")

{

SymList[0] = "AUDNZD"; SymList[1] = "EURNZD"; SymList[2] = "GBPNZD"; SymList[3] = "NZDCAD";

SymList[4] = "NZDCHF"; SymList[5] = "NZDJPY"; SymList[6] = "NZDUSD";

}

//------------------------------------------------ --------------------------------------------------

if (Sym == "USD")

{

SymList[0] = "AUUSD"; SymList[1] = "EURUSD"; SymList[2] = "GBPUSD"; SymList[3] = "NZUSD";

SymList[4] = "USDCAD"; SymList[5] = "USDCHF"; SymList[6] = "USDJPY";

}

//------------------------------------------------ --------------------------------------------------

for (int i = 0, i < 7, i++)

{

카운트 = 0;

Dig = int(MarketInfo(SymList[i], MODE_DIGITS));

로트 = NormalizeDouble(0.01, 2);

// 구입

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;

가격 = NormalizeDouble(MarketInfo(SymList[i], MODE_ASK) + PriceIndent1 / pow(10, Dig-1), Dig);

TP = NormalizeDouble(가격 + TakeProfit1 / pow(10, Dig-1), Dig);

SL = NormalizeDouble(가격 - 손절매 / pow(10, Dig-1), Dig);

티켓 = OrderSend(SymList[i], OP_BUYSTOP, 로트, 가격, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen);

if (티켓 > 0) Count++; else PrintFormat("오더 %i, 기호 %s, 가격 %f 생성 오류, %f 가져오기, %f 중지, %f 로트.", GetLastError(), SymList[i], Price, TP, SL, Lot) ;

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;

가격 = NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig);

TP = NormalizeDouble(가격 + TakeProfit2 / pow(10, Dig-1), Dig);

SL = NormalizeDouble(가격 - 손절매 / pow(10, Dig-1), Dig);

티켓 = OrderSend(SymList[i], OP_BUYSTOP, Lot * Multiplier1, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen);

if (티켓 > 0) Count++; else PrintFormat("오더 생성 오류, 기호 %s, 가격 %f, %f 가져오기, %f 중지, %f 로트.", GetLastError(), SymList[i], Price, TP, SL, Lot* 승수1 );

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;

가격 = NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig);

TP = NormalizeDouble(가격 + TakeProfit2 / pow(10, Dig-1), Dig);

SL = NormalizeDouble(가격 - 손절매 / pow(10, Dig-1), Dig);

티켓 = OrderSend(SymList[i], OP_BUYSTOP, Lot*Multiplier2, 가격, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen);

if (티켓 > 0) Count++; else PrintFormat("오더 %i, 기호 %s, 가격 %f 생성 오류, %f 가져오기, %f 중지, %f 로트.", GetLastError(), SymList[i], Price, TP, SL, Lot* 승수2 );

// 판매

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;

가격 = NormalizeDouble(MarketInfo(SymList[i], MODE_BID) - PriceIndent1 / pow(10, Dig-1), Dig);

TP = NormalizeDouble(가격 - TakeProfit1 / pow(10, Dig-1), Dig);

SL = NormalizeDouble(가격 + 손절매 / pow(10, Dig-1), Dig);

티켓 = OrderSend(SymList[i], OP_SELLSTOP, 로트, 가격, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);

if (티켓 > 0) Count++; else PrintFormat("오더 %i, 기호 %s, 가격 %f 생성 오류, %f 가져오기, %f 중지, %f 로트.", GetLastError(), SymList[i], Price, TP, SL, Lot) ;

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;

가격 = NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig);

TP = NormalizeDouble(가격 - TakeProfit2 / pow(10, Dig-1), Dig);

SL = NormalizeDouble(가격 + 손절매 / pow(10, Dig-1), Dig);

티켓 = OrderSend(SymList[i], OP_SELLSTOP, 로트, 가격, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);

if (티켓 > 0) Count++; else PrintFormat("오더 생성 오류, 기호 %s, 가격 %f, %f 가져오기, %f 중지, %f 로트.", GetLastError(), SymList[i], Price, TP, SL, Lot* 승수1 );

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;

가격 = NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig);

TP = NormalizeDouble(가격 - TakeProfit3 / pow(10, Dig-1), Dig);

SL = NormalizeDouble(가격 + 손절매 / pow(10, Dig-1), Dig);

티켓 = OrderSend(SymList[i], OP_SELLSTOP, 로트, 가격, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);

PrintFormat("기호 %s에 대해 %i개의 주문이 접수되었습니다.", SymList[i], Count);0 }

}

뉴스 파일은 다음과 같습니다.

2016년 9월 15일 01:45 NZD 04:30 AUD 10:30 CHF 14:00 GBP 15:30 USD

2016년 9월 16일 15:30 USD 17:00 USD

등...

 
A13ksandr :

원래 코드로 돌아가자. 다음과 같이 시도하십시오.

int OnInit()

{

if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);

반환(INIT_SUCCESSED);

}

무효 OnDeInit()

{

GlobalVariableSet("AllowNewOrders",1);

}

무효 OnTick()

{

if (CountTrades() == 0) // 주문 수는 0과 같아야 합니다.

{

if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))

// 마지막 거래가 수익성이 없으면 같은 거래가 열리지만 로트가 증가합니다.

{

GlobalVariableSet("AllowNewOrders", 0);

유형 = TypeLastHistOrder();

if (유형 == OP_BUY) 가격 = 묻기;

if (유형 == OP_SELL) 가격 = 입찰가;

로트 = NormalizeDouble(LotsLastHistOrder()*승수, 2);

티켓 = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)

// 마지막 거래의 이익이 0이면 동일하게 엽니다.

{

GlobalVariableSet("AllowNewOrders", 0);

유형 = TypeLastHistOrder();

if (유형 == OP_BUY) 가격 = 묻기;

if (유형 == OP_SELL) 가격 = 입찰가;

많은 = NormalizeDouble(LotsLastHistOrder(), 2);

티켓 = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

|| CountHistTrades() == 0)// 마지막 거래가 수익성이 있으면 주문이 열립니다.

{

if (GlobalVariableGet("AllowNewOrders") > 0) 반환;

if (SignalBuy() && MaxOpenOrders > OrdersTotal())

{

티켓 = OrderSend(Symbol(), OP_BUY, lot, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

if (티켓>0) GlobalVariableSet("AllowNewOrders", 0);

}

if (SignalSell() && MaxOpenOrders > OrdersTotal())

{

티켓 = OrderSend(Symbol(), OP_SELL, 랏, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

if (티켓>0) GlobalVariableSet("AllowNewOrders", 0);

}

}

}

}

나는 그것을 확인하지 않았습니다. 왜냐하면 총 1개의 주문 제한이 있는 어드바이저의 여러 사본이 어떤 심볼(수익성 시리즈 이후)이 거래를 시작하는 것이 더 나은지 결정하는 방법을 이해하지 못하기 때문입니다.

Alexander, 각 기호에서 봇은 한 방향으로 설정에 설정된 연속 촛불 수를 기다린 다음 시리즈를 시작해야 합니다. 즉, 이 조건이 해당 기호에 대해 먼저 작동하고 첫 번째 거래를 여는 기호에서 . 동시에 첫 번째 시리즈가 이익으로 끝날 때까지 다른 기호에 대한 시리즈 열기를 금지해야 합니다.

귀하가 제공한 마지막 코드는 이미 한 단계 발전한 것입니다. 거래를 전혀 열지 않습니다(즉, 금지가 적용됨을 의미함). 왜 아무도 없는지 이해할 때까지. 첨부된 것은 잡지의 스크린샷입니다.

 

코드를 붙여넣는 방법을 배울 시간이 아닐까요?!

 int OnInit ()

{

   if (! GlobalVariableCheck ( "AllowNewOrders" )) GlobalVariableSet ( "AllowNewOrders" , 1 );

   return ( INIT_SUCCEEDED );

}

void   OnDeInit()

{

   GlobalVariableSet ( "AllowNewOrders" , 1 ); 

} 

void OnTick ()

{

   if (CountTrades() == 0 ) // Количество ордеров должно равняться нулю

   {

       if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))

       // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом

      {

         GlobalVariableSet ( "AllowNewOrders" , 0 );

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble (LotsLastHistOrder()*Multiplier, 2 );

         ticket = OrderSend ( Symbol (), Type, Lot, Price, Slippage, 0 , 0 , IntegerToString (Exp), Magic);

      }

       if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0 ) 

       // Если прибыль последней сделки равняется нулю, то открывается такая же

      {

         GlobalVariableSet ( "AllowNewOrders" , 0 );

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble (LotsLastHistOrder(), 2 );

         ticket = OrderSend ( Symbol (), Type, Lot, Price, Slippage, 0 , 0 , IntegerToString (Exp), Magic);

      }

       if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

      || CountHistTrades() == 0 ) // Если последняя сделка прибыльная, то открывается ордер

      {

         if ( GlobalVariableGet ( "AllowNewOrders" ) > 0 ) return ;

         if (SignalBuy() && MaxOpenOrders > OrdersTotal ())

         {

            ticket = OrderSend ( Symbol (), OP_BUY, Lots, Ask, Slippage, 0 , 0 , IntegerToString (Exp), Magic);

             if (ticket> 0 ) GlobalVariableSet ( "AllowNewOrders" , 0 );

         }

         if (SignalSell() && MaxOpenOrders > OrdersTotal ())

         {

            ticket = OrderSend ( Symbol (), OP_SELL, Lots, Bid, Slippage, 0 , 0 , IntegerToString (Exp), Magic);

             if (ticket> 0 ) GlobalVariableSet ( "AllowNewOrders" , 0 );

         }

      }

   }

} 
 
abeiks : 이제 코드를 붙여넣는 방법을 배울 시간이 아닐까요?!
 int OnInit ()                     // ИХМО так нагляднее
{
   if (! GlobalVariableCheck ( "AllowNewOrders" )) GlobalVariableSet ( "AllowNewOrders" , 1 );
   return ( INIT_SUCCEEDED );
}

void   OnDeInit()
{
   GlobalVariableSet ( "AllowNewOrders" , 1 ); 
} 

void OnTick ()
{
   if (CountTrades() == 0 ) // Количество ордеров должно равняться нулю
   {
       if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
       // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet ( "AllowNewOrders" , 0 );
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble (LotsLastHistOrder()*Multiplier, 2 );
         ticket = OrderSend ( Symbol (), Type, Lot, Price, Slippage, 0 , 0 , IntegerToString (Exp), Magic);
      }

       if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0 ) 

       // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet ( "AllowNewOrders" , 0 );
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble (LotsLastHistOrder(), 2 );
         ticket = OrderSend ( Symbol (), Type, Lot, Price, Slippage, 0 , 0 , IntegerToString (Exp), Magic);
      }

       if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
      || CountHistTrades() == 0 ) // Если последняя сделка прибыльная, то открывается ордер
      {
         if ( GlobalVariableGet ( "AllowNewOrders" ) > 0 ) return ;
         if (SignalBuy() && MaxOpenOrders > OrdersTotal ())
         {
            ticket = OrderSend ( Symbol (), OP_BUY, Lots, Ask, Slippage, 0 , 0 , IntegerToString (Exp), Magic);
             if (ticket> 0 ) GlobalVariableSet ( "AllowNewOrders" , 0 );
         }

         if (SignalSell() && MaxOpenOrders > OrdersTotal ())
         {
            ticket = OrderSend ( Symbol (), OP_SELL, Lots, Bid, Slippage, 0 , 0 , IntegerToString (Exp), Magic);
             if (ticket> 0 ) GlobalVariableSet ( "AllowNewOrders" , 0 );
         }
      }
   }
}
사유: