좋아, 나는 약간의 진전을 이루었다. 하지만 문제가 있습니다. 내가 어떤 주어진 쌍에 처음으로 주문을 하면, 내가 역사에서 비교할 거래가 없는 한 주문의 절반이 닫히지 않을 것입니다... 이 경우, 첫 거래가 1:1이면, 히스토리 풀에서 비교할 대상이 없기 때문에 포지션의 절반을 청산하지 않을 것입니다... 마찬가지로, 제가 무엇을 잘못하고 있는지 완전히 확신할 수 없지만, 히스토리에 비교할 거래가 있는 경우에도 ( OrderOpenTime()), 여전히 동일한 가격으로 계속 종료되고 있습니까?
int start()
{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{
OrderEntryTime = OrderOpenTime();
datetime OrderEntryClosed = OrderCloseTime();
CurrentSymbol = OrderSymbol();
if (OrderType() <= OP_SELL && CurrentSymbol == Symbol ())
{
Print ( " The Selected Order " , CurrentSymbol, " matches this pair: " , Symbol ());
Print ( " The Open Time of this order was: " , TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
}
if (OpenOrdersThisPair( Symbol ())> 0 && CurrentSymbol== Symbol ())
{
// Need a for loop to compare historically closed trades that match with Symbol() and the "datetime OrderEntryTime = OrderOpenTime();" above.
CheckHistoricalTrades();
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CheckHistoricalTrades()
{
for ( int Pos=OrdersHistoryTotal()- 1 ; Pos >= 0 ; Pos--)
{
if ( OrderSelect (Pos, SELECT_BY_POS, MODE_HISTORY)
&& OrderMagicNumber() == MagicNumber
&& CurrentSymbol == Symbol ()
&& OrderType() <= OP_SELL
&& OrderEntryTime > OrderOpenTime() && OrderType()==OP_BUY)
{
Print ( " Last Order Open Time: " , TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE),
" Was not the same as current order: " , TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
CloseHalfOrder();
}
if (OrderEntryTime > OrderOpenTime() && OrderType()==OP_SELL)
{
Print ( "Last Order Open Time: " , TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE),
" Was not the same as current order: " , TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
CloseHalfOrder1(); // This just closes half of the position at 1:1 - then if OrderStopLoss > OrderOpenPrice() = MoveToBreakEven() void kicks in.
}
}
}
그래도 문제가 있습니다. 동일한 "OP_BUY" 또는 "OP_SELL"을 다른 가격으로 최대 4번까지 부분적으로 마감하려고 합니다... 제가 질문해야 할 질문은 방법을 찾을 수 있는지 여부입니다. (하나의 주어진 거래에 대한 모든 로트 및 가격의) 마감은 미리 정의된 "OrderClose()" 매개변수 세트에서 한 번만 부분적으로 마감됩니다...
이 방법으로 나는 OrderOpenTime()이 본질적으로 한 번만 작동하고 다른 유형의 OrderClose() 함수가 전혀 발생하지 않도록 제한할 것입니다. 내가 할 수 있는 방법을 찾고 싶습니다. 하나의 규칙이 4개의 OrderClose() 함수에 적용되었습니다... (이게 말이 된다면?)
나는 사람들이 4개의 주문을 열 것을 제안하고 있다는 것을 알고 있지만 너무 깊이 들어가지 않으면 그렇게 하는 것이 덜 효율적입니다.
단순히 티켓 번호와 수행할 수 있는 부분 마감 수를 저장하는 2차원 배열을 사용하는 것이 좋습니다.
개요/의사 코드:
1. 정적 2차원 배열 정의: cOrders[][2].
2. 입력된 각각의 새 주문에 대해: cOrders의 첫 번째 차원을 size+1로 조정하고 새 주문의 티켓 번호를 [x][0]에 입력하고 수행할 남은 부분 마감 수(이 경우 4)를 [x][ 1].
3. 시간 간격에 관계없이(예: 각 start()) 배열을 순환하고 저장된 티켓 번호를 사용하여 각 주문을 선택하고 부분 마감을 수행해야 하는지 여부를 결정합니다.
4. 부분 마감을 수행해야 하는 경우(3단계 참조) OrderClose()를 사용하여 부분적으로 주문을 마감하고 새 티켓 번호를 반영하도록 cOrders[x][0]를 업데이트하고 cOrders[x][1]를 1로 줄이십시오.
5. 마감된 모든 주문이나 수행해야 할 부분 마감 수가 0인 주문을 cOrder에서 제거 합니다.
유일한 문제는 플랫폼/컴퓨터가 다시 시작될 때 수행할 작업입니다. 해당 정보를 파일에 저장하고 플랫폼 재시작 시 init()에서 파일을 읽을 수 있습니다.
티켓 번호와 수행할 수 있는 부분 마감 수를 저장하는 2차원 배열을 사용하는 것은 어떻습니까?
개요/의사 코드:
1. 정적 2차원 배열 정의: cOrders[][2].
2. 입력된 각각의 새 주문에 대해: cOrders의 첫 번째 차원을 size+1로 조정하고 새 주문의 티켓 번호를 [x][0]에 입력하고 수행할 남은 부분 마감 수(이 경우 4)를 [x][ 1].
3. 시간 간격에 관계없이(예: 각 start()) 배열을 순환하고 저장된 티켓 번호를 사용하여 각 주문을 선택하고 부분 마감을 수행해야 하는지 여부를 결정합니다.
4. 부분 마감을 수행해야 하는 경우(3단계 참조) OrderClose()를 사용하여 부분적으로 주문을 마감하고 새 티켓 번호를 반영하도록 cOrders[x][0]를 업데이트하고 cOrders[x][1]를 1로 줄이십시오.
5. 마감된 모든 주문이나 수행해야 할 부분 마감 수가 0인 주문을 cOrder에서 제거합니다.
유일한 문제는 플랫폼/컴퓨터가 다시 시작될 때 수행할 작업입니다. 해당 정보를 파일에 저장하고 플랫폼 재시작 시 init()에서 파일을 읽을 수 있습니다.
이 작업을 수행하는 가장 쉬운 방법은 Magic Numbers를 사용하는 것입니다. . . 숫자의 일부를 사용하여 다른 매개변수 를 정의합니다(예: 부품 수, 주문 번호, 일, 월, EA 번호). . . 모든 부품은 동일한 Magic Number를 가지며 History에서 쉽게 추적할 수 있습니다. 나는 닫힌 부분과 열린 부분 왼쪽 모두 같은 매직 넘버를 가지고 있다고 가정합니다. . .
RaptorUK : 이 작업을 수행하는 가장 쉬운 방법은 Magic Numbers를 사용하는 것입니다. . . 숫자의 일부를 사용하여 다양한 매개변수를 정의합니다(예: 부품 수, 주문 번호, 일, 월, EA 번호). . . 모든 부품은 동일한 Magic Number를 가지며 History에서 쉽게 추적할 수 있습니다. 나는 닫힌 부분과 열린 부분 왼쪽 모두 같은 매직 넘버를 가지고 있다고 가정합니다. . .
정보 조각을 인코딩하기 위해 Magic Number를 사용하는 것은 가능하지만 몇 가지 가능한 제한 사항이 있습니다. 첫째, Magic Number는 int이므로 가장 왼쪽 숫자가 1 또는 2만 될 수 있는 10자리입니다(가장 왼쪽 숫자가 2인 경우 두 번째 맨 왼쪽 숫자는 7 이하여야 합니다. ). 둘째, 현재 주문이 부분적으로 마감되어야 하는지(또는 마감될 수 있는지) 결정하기 위해 각 주문의 모든 부분을 찾기 위해 모든 기록을 검토하는 데 start()당 더 많은 시간이 걸릴 수 있습니다. 더 많은 시간이 사소한 것인지 아닌지 확실하지 않습니다.
잠깐, 매직넘버 몇 개만 있으면 안 될까요? 초기 OrderSend()에 하나를, OrderModify()에 하나를 사용하고 1:1의 첫 번째 목표에서 포지션의 절반이 닫힌 후 MagicNumber를 변경하도록 순서를 수정하십시오. 따라서 처음에 1:1로 반 마감하려고 할 때 현재 열려 있는 "OP_BUY"가 내가 처음 부여한 매직 넘버에 해당하는 한 1:1 로만 마감 됩니까? 부분적으로 닫히면 그 매직넘버를 수정, 변경?!
ㅋㅋㅋ? 정말 간단하지 않습니까?!
업데이트: 오늘 분명히 그만 봐야 합니다. - MagicNumber를 수정할 수는 없습니다. - 빌어먹을 수 있기를 바라지만... (facepalm) - 이 모든 것이 얼마나 쉬울지 상상할 수 있나요...
DomGilberto : 잠깐, 매직넘버 몇 개만 있으면 안 될까요? 초기 OrderSend()에 하나를, OrderModify()에 하나를 사용하고 1:1의 첫 번째 목표에서 포지션의 절반이 닫힌 후 MagicNumber를 변경하도록 순서를 수정하십시오. 따라서 처음에 1:1로 반 마감하려고 할 때 현재 열려 있는 "OP_BUY"가 내가 처음 부여한 매직 넘버에 해당하는 한 1:1로만 마감됩니까? 부분적으로 닫히면 그 매직넘버를 수정, 변경?!
ㅋㅋㅋ? 정말 간단하지 않습니까?!
아니요. 첫째, 초기 OrderSend() 이후에는 OrderModify() 를 사용하여 Magic Number를 추가/수정할 수 없습니다. 둘째, OrderClose()를 사용하여 부분 주문 마감을 수행하면 새 주문(내 생각에)은 이전 주문과 동일한 매직 번호를 얻습니다.
아니요. 첫째, 초기 OrderSend() 이후에는 OrderModify() 를 사용하여 Magic Number를 추가/수정할 수 없습니다. 둘째, OrderClose()를 사용하여 부분 주문 마감을 수행하면 새 주문(내 생각에)은 이전 주문과 동일한 매직 번호를 얻습니다.
네. 내가 얼마나 지체되고 있는지 깨달았습니다. 긴 하루!
예, 첫 번째 부분 마감 후 나머지 위치에는 처음 시작한 것과 동일한 매직 번호가 할당됩니다.
지금 너무 답답하네요... 매직넘버만 수정하면 너무 쉬울텐데!? 한 번만 부분적으로 포지션을 청산하고 OrderClose() 내에 지정된 사전 정의된 가격으로 여러 번 수행하는 논리적 방법이 있어야 합니다. - MagicNumber()를 수정할 수 있도록 업데이트가 필요합니다!
문제가 바로 정면으로 나를 노려보고 있다는 것을 알고 있지만 볼 수 없습니다...
그래도 문제가 있습니다. 동일한 "OP_BUY" 또는 "OP_SELL"을 다른 가격으로 최대 4번까지 부분적으로 마감하려고 합니다... 제가 질문해야 할 질문은 방법을 찾을 수 있는지 여부입니다. (하나의 주어진 거래에 대한 모든 로트 및 가격의) 마감은 미리 정의된 "OrderClose()" 매개변수 세트에서 한 번만 부분적으로 마감됩니다...
이 방법으로 나는 OrderOpenTime()이 본질적으로 한 번만 작동하고 다른 유형의 OrderClose() 함수가 전혀 발생하지 않도록 제한할 것입니다. 내가 할 수 있는 방법을 찾고 싶습니다. 하나의 규칙이 4개의 OrderClose() 함수에 적용되었습니다... (이게 말이 된다면?)
나는 사람들이 4개의 주문을 열 것을 제안하고 있다는 것을 알고 있지만 너무 깊이 들어가지 않으면 그렇게 하는 것이 덜 효율적입니다.
단순히 티켓 번호와 수행할 수 있는 부분 마감 수를 저장하는 2차원 배열을 사용하는 것이 좋습니다.
개요/의사 코드:
1. 정적 2차원 배열 정의: cOrders[][2].
2. 입력된 각각의 새 주문에 대해: cOrders의 첫 번째 차원을 size+1로 조정하고 새 주문의 티켓 번호를 [x][0]에 입력하고 수행할 남은 부분 마감 수(이 경우 4)를 [x][ 1].
3. 시간 간격에 관계없이(예: 각 start()) 배열을 순환하고 저장된 티켓 번호를 사용하여 각 주문을 선택하고 부분 마감을 수행해야 하는지 여부를 결정합니다.
4. 부분 마감을 수행해야 하는 경우(3단계 참조) OrderClose()를 사용하여 부분적으로 주문을 마감하고 새 티켓 번호를 반영하도록 cOrders[x][0]를 업데이트하고 cOrders[x][1]를 1로 줄이십시오.
5. 마감된 모든 주문이나 수행해야 할 부분 마감 수가 0인 주문을 cOrder에서 제거 합니다.
유일한 문제는 플랫폼/컴퓨터가 다시 시작될 때 수행할 작업입니다. 해당 정보를 파일에 저장하고 플랫폼 재시작 시 init()에서 파일을 읽을 수 있습니다.
티켓 번호와 수행할 수 있는 부분 마감 수를 저장하는 2차원 배열을 사용하는 것은 어떻습니까?
개요/의사 코드:
1. 정적 2차원 배열 정의: cOrders[][2].
2. 입력된 각각의 새 주문에 대해: cOrders의 첫 번째 차원을 size+1로 조정하고 새 주문의 티켓 번호를 [x][0]에 입력하고 수행할 남은 부분 마감 수(이 경우 4)를 [x][ 1].
3. 시간 간격에 관계없이(예: 각 start()) 배열을 순환하고 저장된 티켓 번호를 사용하여 각 주문을 선택하고 부분 마감을 수행해야 하는지 여부를 결정합니다.
4. 부분 마감을 수행해야 하는 경우(3단계 참조) OrderClose()를 사용하여 부분적으로 주문을 마감하고 새 티켓 번호를 반영하도록 cOrders[x][0]를 업데이트하고 cOrders[x][1]를 1로 줄이십시오.
5. 마감된 모든 주문이나 수행해야 할 부분 마감 수가 0인 주문을 cOrder에서 제거합니다.
유일한 문제는 플랫폼/컴퓨터가 다시 시작될 때 수행할 작업입니다. 해당 정보를 파일에 저장하고 플랫폼 재시작 시 init()에서 파일을 읽을 수 있습니다.
매직 넘버의 일부를 사용하여 다른 매개변수 를 정의하는 방법에 대한 단서가 없습니까? OrderOpenTime()을 사용하는 것이 논리적 경로가 아닐 것이라고 생각합니다... 이 스레드가 얼마나 오래 걸리는지 믿을 수 없습니다. ㅋㅋㅋ.
나는 (다른 모든 사람들의 많은 도움을 받아) 이 문제를 해결한 후에 이에 대한 스레드를 작성하겠다고 신에게 맹세합니다.
이 작업을 수행하는 가장 쉬운 방법은 Magic Numbers를 사용하는 것입니다. . . 숫자의 일부를 사용하여 다양한 매개변수를 정의합니다(예: 부품 수, 주문 번호, 일, 월, EA 번호). . . 모든 부품은 동일한 Magic Number를 가지며 History에서 쉽게 추적할 수 있습니다. 나는 닫힌 부분과 열린 부분 왼쪽 모두 같은 매직 넘버를 가지고 있다고 가정합니다. . .
정보 조각을 인코딩하기 위해 Magic Number를 사용하는 것은 가능하지만 몇 가지 가능한 제한 사항이 있습니다. 첫째, Magic Number는 int이므로 가장 왼쪽 숫자가 1 또는 2만 될 수 있는 10자리입니다(가장 왼쪽 숫자가 2인 경우 두 번째 맨 왼쪽 숫자는 7 이하여야 합니다. ). 둘째, 현재 주문이 부분적으로 마감되어야 하는지(또는 마감될 수 있는지) 결정하기 위해 각 주문의 모든 부분을 찾기 위해 모든 기록을 검토하는 데 start()당 더 많은 시간이 걸릴 수 있습니다. 더 많은 시간이 사소한 것인지 아닌지 확실하지 않습니다.
잠깐, 매직넘버 몇 개만 있으면 안 될까요? 초기 OrderSend()에 하나를, OrderModify()에 하나를 사용하고 1:1의 첫 번째 목표에서 포지션의 절반이 닫힌 후 MagicNumber를 변경하도록 순서를 수정하십시오. 따라서 처음에 1:1로 반 마감하려고 할 때 현재 열려 있는 "OP_BUY"가 내가 처음 부여한 매직 넘버에 해당하는 한 1:1 로만 마감 됩니까? 부분적으로 닫히면 그 매직넘버를 수정, 변경?!
ㅋㅋㅋ? 정말 간단하지 않습니까?!
업데이트: 오늘 분명히 그만 봐야 합니다. - MagicNumber를 수정할 수는 없습니다. - 빌어먹을 수 있기를 바라지만... (facepalm) - 이 모든 것이 얼마나 쉬울지 상상할 수 있나요...
잠깐, 매직넘버 몇 개만 있으면 안 될까요? 초기 OrderSend()에 하나를, OrderModify()에 하나를 사용하고 1:1의 첫 번째 목표에서 포지션의 절반이 닫힌 후 MagicNumber를 변경하도록 순서를 수정하십시오. 따라서 처음에 1:1로 반 마감하려고 할 때 현재 열려 있는 "OP_BUY"가 내가 처음 부여한 매직 넘버에 해당하는 한 1:1로만 마감됩니까? 부분적으로 닫히면 그 매직넘버를 수정, 변경?!
ㅋㅋㅋ? 정말 간단하지 않습니까?!
아니요. 첫째, 초기 OrderSend() 이후에는 OrderModify() 를 사용하여 Magic Number를 추가/수정할 수 없습니다. 둘째, OrderClose()를 사용하여 부분 주문 마감을 수행하면 새 주문(내 생각에)은 이전 주문과 동일한 매직 번호를 얻습니다.
아니요. 첫째, 초기 OrderSend() 이후에는 OrderModify() 를 사용하여 Magic Number를 추가/수정할 수 없습니다. 둘째, OrderClose()를 사용하여 부분 주문 마감을 수행하면 새 주문(내 생각에)은 이전 주문과 동일한 매직 번호를 얻습니다.
네. 내가 얼마나 지체되고 있는지 깨달았습니다. 긴 하루!
예, 첫 번째 부분 마감 후 나머지 위치에는 처음 시작한 것과 동일한 매직 번호가 할당됩니다.
지금 너무 답답하네요... 매직넘버만 수정하면 너무 쉬울텐데!? 한 번만 부분적으로 포지션을 청산하고 OrderClose() 내에 지정된 사전 정의된 가격으로 여러 번 수행하는 논리적 방법이 있어야 합니다. - MagicNumber()를 수정할 수 있도록 업데이트가 필요합니다!
당신은 전혀 논리적으로 생각하지 않습니다.
1. 매직 넘버를 수정하는 것이 OrderOpenTime()을 아는 것보다 어떻게 도움이 될까요? 그것은 그 주문에 대한 식별자와 정확히 같은 것에 해당합니다.
2. timetostr을 사용하여 일/시/분 형식으로 변환하는 이유는 무엇입니까? OrderOpenTime()은 이미 다음과 같은 타임스탬프 형식으로 되어 있습니다. 1375356521 주문이 열렸을 때의 정확한 시간을 초 단위로 나타냅니다.
매직 넘버를 변경할 수 있다면 주문의 매직 넘버를 비교하여 매직 넘버가 없는지 확인하게 됩니다.
그렇게 할 수 있다면 주문의 OrderOpenTime을 이미 부분적으로 마감된 시간 스탬프와 비교할 수 없는 이유는 무엇입니까?
정적 날짜 시간이 이미 부분적으로 닫혔습니다.
부품 마감 주문이 성공한 경우
이미partclosed = OrderOpenTime();
주문이 부품 마감 기준을 충족할 때
if(OrderOpenTime() != 이미 파트가 닫혀 있음)
동시에 여러 개의 미결 주문을 관리하는 경우 array[]를 사용하여 부품 마감 주문의 각 타임스탬프를 보관합니다.