陣列無法使用Array_Copy?

  •   184 
  • 最後發表   MMC  2020 四月 28
MMC 發文於   2020/04/21

您好:

在寫警示程式時,以下的陣列程式中,

原始程式使用Array_Copy進行陣列複製,

卻沒辦法複製陣列內容,內容都為0;

使用Array_Copy函式教學裡的範例,

是可以正常顯示陣列Copy的結果。

1、請協助測試Array不能copy的原因?

2、使用陣列時,如果雷達有勾選「逐筆洗價」,陣列宣告時是否要使用intrabarpersist ?

以下附上程式碼及print的結果,謝謝。

 

========程式碼

Array: arrA[5](0); // 宣告arrA是一個有5個元素的陣列,初始值都是0
Array: arrB[5](0); // 宣告arrB是一個有5個元素的陣列,初始值都是0
Array: arrC[5](0); // 宣告arrC是一個有5個元素的陣列,初始值都是0
 
 
arrA[1] = 1;  arrA[2] = 2; arrA[3] = 3; arrA[4] = 4; arrA[5] = 5;
 
 
Array_Copy(arrA, 1, arrB, 1, 5); // 執行後 arrB = [1, 2, 3, 4, 5]
Array_Copy(arrA, 1, arrC, 2, 3); // 執行後 arrC = [0, 1, 2, 3, 0]

print("ArrA[1]=",numtostr(arra[1],0));
print("ArrA[2]=",numtostr(arra[2],0));
print("ArrA[3]=",numtostr(arra[3],0));
print("ArrA[4]=",numtostr(arra[4],0));
print("ArrA[5]=",numtostr(arra[5],0));
print("");
print("ArrB[1]=",numtostr(arrB[1],0));
print("ArrB[2]=",numtostr(arrB[2],0));
print("ArrB[3]=",numtostr(arrB[3],0));
print("ArrB[4]=",numtostr(arrB[4],0));
print("ArrB[5]=",numtostr(arrB[5],0));
print("");
print("ArrC[1]=",numtostr(arrC[1],0));
print("ArrC[2]=",numtostr(arrC[2],0));
print("ArrC[3]=",numtostr(arrC[3],0));
print("ArrC[4]=",numtostr(arrC[4],0));
print("ArrC[5]=",numtostr(arrC[5],0));
print("");

variable: intrabarpersist ArrayItemPriceIn(1);//default index start =1
variable: intrabarpersist ArrayItemPriceInCount(10);
Array: ArrayPriceIn[](0);
Array: ArrayPriceIn1[](0);
variable: m(0);
variable:KBarOfDay(0);

if Date<> Date[1]
then
    KBarOfDay = 1
else
    KBarOfDay+=1;

//First Resize Array
if (KbarOfDay = 1)
then
    begin
    print("===First resize");
        Array_setmaxindex(ArrayPriceIn,ArrayItemPriceInCount);
    end;
   
print("execute array copy start");
Array_copy(arrA,1,ArrayPriceIn1,1,5);
Array_copy(ArrayPriceIn,1,ArrayPriceIn1,1,ArrayItemPriceInCount);
print("execute array copy end");

print("");
print("ArrayPriceIn01===");
for m = 1 to ArrayItemPriceInCount
begin
    print("m=",numtostr(m,0));
    print("PriceIn=",numtostr(ArrayPriceIn[m],2)," PriceIn1=",numtostr(ArrayPriceIn1[m],2));
end;

ArrayPriceIn[1] = random(999);
ArrayPriceIn[2] = random(999);
ArrayPriceIn[3] = random(999);
ArrayPriceIn[4] = random(999);
ArrayPriceIn[5] = random(999);
ArrayPriceIn[6] = random(999);
ArrayPriceIn[7] = random(999);
ArrayPriceIn[8] = random(999);

print("");
print("ArrayPriceIn02===");
for m = 1 to ArrayItemPriceInCount
begin
    print("m=",numtostr(m,0));
    print("PriceIn=",numtostr(ArrayPriceIn[m],2)," PriceIn1=",numtostr(ArrayPriceIn1[m],2));
end;

 

=========print結果

ArrA[1]= 1
ArrA[2]= 2
ArrA[3]= 3
ArrA[4]= 4
ArrA[5]= 5
 
ArrB[1]= 1
ArrB[2]= 2
ArrB[3]= 3
ArrB[4]= 4
ArrB[5]= 5
 
ArrC[1]= 0
ArrC[2]= 1
ArrC[3]= 2
ArrC[4]= 3
ArrC[5]= 0
 
execute array copy start
execute array copy end
 
ArrayPriceIn01===
m= 1
PriceIn= 858.60  PriceIn1= 0.00
m= 2
PriceIn= 516.92  PriceIn1= 0.00
m= 3
PriceIn= 706.80  PriceIn1= 0.00
m= 4
PriceIn= 255.92  PriceIn1= 0.00
m= 5
PriceIn= 920.13  PriceIn1= 0.00
m= 6
PriceIn= 490.77  PriceIn1= 0.00
m= 7
PriceIn= 93.45  PriceIn1= 0.00
m= 8
PriceIn= 825.16  PriceIn1= 0.00
m= 9
PriceIn= 0.00  PriceIn1= 0.00
m= 10
PriceIn= 0.00  PriceIn1= 0.00
 
ArrayPriceIn02===
m= 1
PriceIn= 76.62  PriceIn1= 0.00
m= 2
PriceIn= 282.35  PriceIn1= 0.00
m= 3
PriceIn= 383.48  PriceIn1= 0.00
m= 4
PriceIn= 642.63  PriceIn1= 0.00
m= 5
PriceIn= 514.58  PriceIn1= 0.00
m= 6
PriceIn= 431.10  PriceIn1= 0.00
m= 7
PriceIn= 140.58  PriceIn1= 0.00
m= 8
PriceIn= 974.00  PriceIn1= 0.00
m= 9
PriceIn= 0.00  PriceIn1= 0.00
m= 10
PriceIn= 0.00  PriceIn1= 0.00

排序方式: 標準 | 最新
XQ小幫手 發文於   2020/04/23

Hi MMC

小幫手已經收到您的問題,請您稍後

如果小幫手有確認狀況會再回覆您,謝謝。

XQ小幫手 發文於   2020/04/24

Hi MMC

經查看您的語法,發現了兩個問題,以下向您說明

1.您只有array_setmaxindex了ArrayPriceIn,另外一個被遺忘了,應該要補上,您沒有設定陣列大小是不能複製的喔~

Array_setmaxindex(ArrayPriceIn1,ArrayItemPriceInCount);

2.您原本的array_copy的語法如下,後面為解釋

小幫手猜想您應該是要arrA複製到ArrayPriceIn,再複製到ArrayPriceIn1,您原本的語法複製錯欄位了

Array_copy(arrA,1,ArrayPriceIn1,1,5);---->您將arrA,複製到一個未宣告範圍的陣列==>複製失敗
Array_copy(ArrayPriceIn,1,ArrayPriceIn1,1,ArrayItemPriceInCount);
-->ArrayPriceIn為已經宣告,但沒有內容的陣列,猜想您應該是上一個複製錯地方。

因此語法概括修改成

variable: intrabarpersist ArrayItemPriceIn(1);//default index start =1
variable: intrabarpersist ArrayItemPriceInCount(10);
Array: ArrayPriceIn[](0);
Array: ArrayPriceIn1[](0);
variable: m(0);
variable:KBarOfDay(0);

if Date<> Date[1]
then
    KBarOfDay = 1
else
    KBarOfDay+=1;

//First Resize Array
if (KbarOfDay = 1)
then
    begin
    print("===First resize");
        Array_setmaxindex(ArrayPriceIn,ArrayItemPriceInCount);
        Array_setmaxindex(ArrayPriceIn1,ArrayItemPriceInCount);//多了這一行
    end;

print("execute array copy start");
Array_copy(arrA,1,ArrayPriceIn,1,5); //改成複製到ArrayPriceIn
Array_copy(ArrayPriceIn,1,ArrayPriceIn1,1,ArrayItemPriceInCount); //再從ArrayPriceIn複製到ArrayPriceIn1,1
print("execute array copy end"); print(""); print("ArrayPriceIn01===");

....以下省略

就可以正常的使用囉,提供給您參考,謝謝。

MMC 發文於   2020/04/24

謝謝小幫手協助,程式的部份繼續修改中,謝謝。

那第二個問題,再幫忙回覆,

使用陣列時,如果雷達有勾選「逐筆洗價」,陣列宣告時是否要使用"intrabarpersist" ?

有沒有可能陣列內的資料,因為逐筆洗價的關係,陣列的值會每次都還原預設值呢?

我想在某個條件完成後,自行透過程式改寫陣列內容。

謝謝

XQ小幫手 發文於   2020/04/28

Hi MMC

是的,如果是有勾選逐筆洗價,就會建議客戶使用intrabarpersist

因為現在提供的最低頻率為1分K,無論有沒有換bar,我們都希望可以記錄上一次運算的結果

這時候就需要用到intrabarpersist去記錄這個變數

實際上的運用還是要依照情境而定,但不會因為逐筆洗價的關係,陣列的值都會被還原為預設值

除非您的語法有將它變為預設值。

請參考一下intrabarpersist的說明與範例,謝謝。

發表回覆
Close