1110001110101010000100001110001001000001011100001000100000110000001011110101011110001101001001111001011101010011111011100001010000110000111111110111010100010101111111000111100001100010110111010011000011001110100000011100010010000111101101111111101001001000110111100100100001110000110011100100111010001010100011100000101001011000000110010100100011011000011110110101111100110110011111100111110001000010 1011001100011000010111101100111000011111110010000010000111101010110110010000010000000010010011111000010110100110000110010100100000010100011010001110011010000010111000100000000011010000011101100000011001001001100000001100010101010011100001111001011110010111100011011001101000000111011110101100111111101000010010101100000110010001000111011101011001000011001110011001001110001011101011001101001001101100 1100110100111001011000111110111111000001010010110100110011101011001100001111010011101001111101111101000011110000010111001111010000111011010110101101110100100010101011100000001101000000101111001110001111111000101111010110000111000110100100000110110100010101011101101000001001001101001000001000010001011011101001110101011001100110101000100011111110100001011000010000011110101100010110001000010110000100 0100000111110000001011001111011010100111000001110100101100111111000011011010101110010001001110001010001100111100011001100001101001001011011010100111001100011010100000100100001001011000010010001111110110010110100100111000010111111110011001100001110101100101010000000010110100100101111011011110011101111000010110111011111000100011000011000110000000110011010110011001101010101000001100000001110111110011 1111011010111100001001101000011100100001001111000111100101000110000011010110001001000001111010000000111000111000010101100000101111011010110101001001001011000001011011111110000001101011000100000010001101111111010110010100101010000110010101010111111000101010111011010001100111000111111010110110011000100011010000001101100000100111001111011010110111100111001111100000001100000111110100001000010001100101 1001011110010000110001110011100111101010001001101111001011000010001001100101000111100100101110011111110111100110010011110111001101000001101001111110000010001000100001101011001000100111000001001011010011100001001111011000110010010101110111101001110000110010111000011101011010100110101111101001111111000110110001101001011110001010101001000011000111011100010110011100000100000000001101100101101100100100 0000001000000101110010111011010010110101000010001000100110001100001111010100000011110100100100101001010100101001111101001011111100010110111000010011001000011111011111101100101111110101100010111111001101011011001001101000011110011000000100111000001011101101010101000100001001111000110001010011111011100110010010101101101000101010101111111000100011000101110010110011110111000100100110110000110000101110 1110010000011110111100010010011010101111001000001100111100010110100011111010110001101001000010001010010110110111101011111111101000011100101110110001100111101010000001110100101011000001111010000011101001001000011010111001010000000110011000001100001011100001111100010001100010110101011110001000100100111101011010111011001111101110101111100001001000001000011111101000000001000001010101110011001010011110 1000011000110000101101011011011001000100000100100001011100101011000000111111010111010001111010000010001111110111011000001111000110010010101010110000011000100100111111101000000110110011000101011110000000101110001001101011010001011111100000110000000010100000001100010110001100011100010000111000010010110000100101001100011011110001010111100101010011111101011011110101110101111001111001101000001011011111 0110000101111000000011011101011111110111101000101101001010000000001001001000110010010110000010111010011000110001000110001111111010010011111100101111001010110100000111011111000110011100101010000111111001000111011011111101011011011100000111000010110110001110001110010110110110111100110001001100111010101010010100100010000110110111100011111010100010010110000001000101110110010011100101111010100110111111 1010011100110111001110001111110010111101111011001010001100011101010111001100010011110100011001101101110111110000110111110011011011111001111100000110111100100110010100000000110000111110010011110010010110101000001000001101111010111011111011110001101100010010111111011110011100111001000000010100011000111100011100110101011111100100000010111100011100011000111110111101011100001000001001010000010101001011 0010111110010111010100010110010010100001010000000000111100101111001011110110101101010110110100001010011010100000110101100011010011010001100011001010011101011111111111000011100100101101111110110001010100000001101111000000010111100010100011111001000000010011100110001111110101100111100011111111010010111000011001111000011011000010111001101101111111001100100101110011011110000110100111101110011100010011 0110001110001101100011000000011100101110011011111110110101010011011001101010010110010110000100100011100110110101110100101101111100110001101001100101010011110001101100111100111101110110011010110111010110100011111001111100100100100101001110001100110011011110001111011010110110011011100111001110011001110101110000111110101100101110010111111111010110011010110000000001101010011000101101011101011011110100 0101101110011000101011111100100001100111011101011001000011000001100001101000110010000110010001000011100011011011000101110110011111000100011010100000101101001111001000101100010001101011010001001010010100111010101100000010000111101111001000110111001101111100001100110001101010011100100010000000111011000101111110101010101011000001110100010111100100001000000010011100011100011000010110100111001111111011 0110111001110010100101000101110111001001100111101101101111011111011001110010100100100011111010010000010001011011011000110001100111101101001010001010011010100101100010001000111110111011101011111001001010101111010000100010101000011110000111000100110111111111100001110111000011010001101100110011010011010011000011101101111000111100101000000111110011110100100010000011010011101010000011101110100101101011 0101101010110001111111101001011111111011110101001000001110111011000000101000011111111000110011000011011010101000110010011010111010001101001010100011101001010011011001101100111001110011000100011100100110110011110100111010111111010010111101111011010100011110110101010001101001100110101010001010001011001010101000010010100000110011001101111001011101011000100110011011110011100110000101011111001100111011 0010111100110100001100001010001111011100010000111101000000111000000111001100110011010010100010001010101110010001111100001101001001001011110010011010000110001111001010011001000001100101111101000101001100110101100011101000110100101100010100011011101101110100100111011100101101101001110111100101010110000110101100100100111010010100110100110101100100101101001011010001101000011100110111011001110100010000 0111110101001110010101000000000111110100101111011011110111000010110011100111111010010111000001010011101011011011101111001001001110010110101100110111111001010000000101111001111000001010111100101001111111001010100011000100001010010011011100010001100000110100100011011100110100001111000001010001000100011000100111011111000000011101101000101000010000111000100011000001100111111111100011010000011100011010 1111111001101101010101110010010000011110101011100111011100111001000101100100001011011011000110011001101011011010010111000001101001010010110011001111110101110001001110010111101100111011100110011111011000110011101100110111001110011100000011111011001010011100000001111111010000001010000111110111111010111100111011010100001101011101100110011011001001001000111111010011110011111110011100111100000000001111 0000111011100001100111101111111000011100111010110100011111001011111101001100000001101110011111000000100110000000001100101110010011110010010011010101101101000001101001111110000111111001111100010100111101111101101000001110010010010110000101110101110111000010000000100110100001010010111001001001100100101000011011111001000111011110100110001010110010001111001101111001111101111010001001111001110010001100 0010010101001011110000000111110001011110110001110100111100000110010011000000111110001000110101100101101010111100100100001001011001110010101001100011010011111101011110100101101011101010110100111010111100111001010010110110000101100011101101110101101010110101100001101110111000011011110101011101011110110111001010011000111100101001000110100000010110010100111000001101010001100110010100111001110100001100 1100101100000111010101111001110100010010100011000011101011110111001001101010100101101000101000110111010100101011011010110000110110010100101101011101011001000011001100000111000101001111001010110110011000111100010111100100000101110111000001011000100010101100001111000011110010101100001111011001011110010110100001100100110011000111011010101011011101011110100011001110100110111100000110001100101100101010 1111001001011001001101010010011000001000111100001111110011010110100010011011001100010000100110101111100110000001001100111100010111101110001101110110101111011110101000000011011111101100111111000100010100011110001101111111011011111010101100111101001100010000100010111010011111001101100100000000110111101000110110110100101000110011100101111100010010000101001111110010001011011110100101011011000010011110 1100001111010010010010100010000110100010001000000110111111001111101100010101011000101010111111001111111000000100100111100111110111100100101100110101011100110100100010101110010000000010000001100000101101010100101101100010100101111010110011110111110011100110010010100010000101100001111001111110110111010100001110110110000110011011101110111011010111011000001011011011111001110001011011110101101110011101 0110010111110000111101111101001100011101100110011000101100100011111100110101000101110001000101001111110010001111111110101011010101100010010101110111010000011010011101010010010111010111011110101000000101100000101101110100000101101111011000100100110011100101100001110110110010011100111011010101100011100100111010100100100111010110110110000011011000110111111110101111010011011000000001100111010101100100 0010000100110101110000101110100011111011011000111001011000110101100011010101001110000001000100100100001011000010000011100100100101011100011100110011010000111010101010010010111110100001111111110100111100111010101001100101010000110000111101001101101100000101100001100010000111001101011001000110001110001011100001010110001000100101111001101000010110100111111011100011010001100110100110101000110000000110 1110000000111111000111100010101111110011110001001111110010110100100000100010100000010101101000010100101000000000111101001100101100110001001100000111110001010100100000000110111101100000011001001101111111001110011000100110101111101101111111000001110101000110111001011100101010001111010010011101000111101010000010101010100100110100010110001111000010010011010001100010001101100000111100011110010110101111 0011110000101101010010100100111000011110101010101110101110101010110011011100000010111111101010100110101001001000001100000001010000100110001001000110000110111001101111111011110111111011101100011011100101111000110100111010011010011101100100001101100010011101111001110110001101001101110001100110110010101001011110010100000100000100000100110010011011010010010001001000010101010110011111111110000111001111 0001010001110111001100000000011101111011000111010111110111000110111001000000010001110100100111010110011001011100010011001011100001001110001101101101011100000101101110010001101110100110000010101110001110110011010000101101110101010010001000100101100000011111100110001011000101000101000011110000110000110001110010000011000110111010100001010110011100101100101011010100001110001001010100000111011011100011 1011011100110011101011101000111010000011001010011101101001011000110000101100000100111010111001100110010100000111100111101000100110011111010010001011011011101110010111101001000110000101010101000001011110010110100101100110001000001000001001100011101011100010011100100001010111100101000010010011011110000110000011001100111111101111111011100001001001101000100111111001001001000010010110101110001000101010 1000111101100011100100100110011110011101010101100001000110101100101101110110101000001001101001101011111010101011111011001100100111111111110110000011001111110100110001010010000001000001010110101010111000100110100100100110001111101111000111000010111100100100000101010001010111101100000110101101001110111000001111011011111001010011110111010010001001101110101000001110011101011111001111001100110011100111 0101100100011000010000110000010100001101011000000011011000100101000011111000111011110111110010100011011110111101011111011010001000011010100100010000000000000100000100111011010100111111000100111101010111011001001101000110010101101110000101001000001101100010000010101111110001011100111101001000101001001101110010001000010010011001110001100000100101100011001101010111100010010000001010011110111001110111 1100010010100000110001110110110000000100111011100100101111110001001000010110000011001010101101011111001000011111001101100101010111100111011100110000001010111100001110011000001100011010100101101110101000110010111010110101101000010011101110111000110011100100011001011101010000000001011011101000000011101011101100101101000101111101001101101001101010000001111100110110000110100100110111000110101111110101 1000010111011000000111110110000101010000011110100001111101101010111000000010101011011101111011011011011100100000011100011001001011001101111000000010000001111011000111110011010100101010001010001001100111110110000001100010111101010100000001111101101100001000100100010011000010011011011000011001000100101110000101000110010001110001001110101101010001101100110001100111011010101111011011101101100110001100 0010111001000011111010101111101111010110011001001000101101011000111000111111100011100001011101100000111011010001111011011001111011000110000100010001001010110010001000001100100011000111001101100000010111011001100111111010011110010110100001110001011100111101011101100100011011001010110001110000101000000000000001001010111110001101100110111001010010011000001011100110111010101000001110010111011100100000 0110001010010101001110000010011101010110001100000110111011011110110000110001010101101101110010010000100000001001010101110101100010100001111001110111111101011001111001111100101000111011110010101011010110010101111111011011111110000001010010010101010110110001000011011111101100111100010100110011011101110011100011010010001000010001001000001000010100100100001101101010011100001100000110010101001100000011 1001110000111111111010111000100011110100011111101000111001111001011111011010001000111101101011001011100100101001110001010100011111100111110001010010001101011001111001110110100100111011011111110101111001011010001100011011100011001111101101011011110011100101011010001000100000111100001100001110101111010100010000011110010001100010010111001010101100010011001101110010101111011011001111010001011001100101 0100010111101100111001110011111001000111111001110110110010011011000101001110010111011100111110110110000011110000001101110101000011010001100101011100010111100010111111100100011101100110000101010001000101111011011000110001100110111011011110110101001000100111101101100100011111010111001010110110010001000010110001101100001100011001010010110000100111010011100000100100111001101011010010101110110101111010 1110011101100000011110110110000001010111100001001001110111011111111011100001001011010001010111101111111100010110001101101010010010011111010000010010000101011000101001100101000101110000111001010011001100011001010100100111110111101010010101100110001001010111000011101100000001001100010001101101000010101111010110110101011000100001000101100110010010001111110011011101011001011111111000001100111100101100 1001000000100110100011000111001001000100001110001000001010101111111111101001001011010011111010100010100010110101101011111010010001000111011000000111110000110011000001010010000001111010011100111010110010011110111110011111101011010110111101000111110110100111101010110011111111010011101111101100001111101011101001000011110100111011011000011000000000001101011001110010010100011011001110101110101011001111 0111001001000001111000100100100010111001110000110010110100111101110010110011100111001111100100010010001000001001001010000110000001001100000111001011011010111110011110011010001100011000110110101100111110100010011010010100101110110110101010101110000101101001111010111110000011101010011011111010110100110001100110011010110010010000101101000010001011001111101010011110001000000000001100011100111111110101 0110001010101011101110001100000100011001101010101000110011101000100011011001010010101000101101110010001001111100111011100010111110010010100101101010010100111011110100010100100110001110111111000101001110010010110100110010100001100100000000010101110001100111110101010010010000111000110001111110100001100010011100101000000011011100111101101100001110001110000110101111001111010010101001000111011011100111 1000111001010110111000011011110000001010110011000011010100010011000001011000100010100000010100001110010011011110101011010111000100010101001010110111100000110011011110111111000001011101101001111010100110110110100000111001100001010110111111001101011001100110101011101011010011011000110110010100001100001011011011000000000001100000011101001110010001100011111001100111110110011100101011101100100000100001 0101000010101100111110100101000111101011110001001110001110111110011111101011001110010100100011000111001010101110111100010000010011010101000011101101001001001100100100011101100101001010110011101000101000010111011110110000001011000000110010001001110000001010111101001000101001110101001111010111101011100101111011010001010000101000011001000101110010110101001110110011000011110011010110001010110011011100 0010001011111101010100011000101001010010101011101100110100001011011101010110010001000000101000000110101110100011000111100011011110111011110011101110000001011110011111111010000010010000011010101100111010100111010100100111111111001011010101010101111110110010000000111100110000110110000111000100011011110001011111010001101110000011100100100101000011010100100101101111000101001111111100000100001110001011 1000110111111110111100100011000010001001000011001101110100100010010011110011011010111111001111101011111011100101110010010111101111100110101000101100000000000111000011111010101001010000001110000001001101010101011100001011111011001110101000001011001111001011010010010100101001110011110001110111001100101001000001101010110101111111101000001110100101101101111100111001010001010001110110110111110000011101 0000000110100100101110100011100110110001010101011010100000101110101101111011010010111011000001001000001110111100011111010110100010011000111001100000011001001100101110001110010101001011000101011111111000100100011011111101010001111100010011000101010100010011010000110010101111111000010001000111101000011011000010000111101111101100101010111001010000001011000110000010011110100100110010000010101101010101 1011100100001011011011010110100110010000001101101101100001001000100110010100000000101110001001011110111011101001110111010001000000011111100010100110010000010110000010011101101101101111010011111110011111011110100110101001101010010000101101001011001001100101101000000101101011000000010001010100010110001110111111010000101001110111000100001010010000101110111000110011111110000000000101011111010011111001 1100110100010010111100101011101001111000000010011110100000010100100001100010011110100111100000001001011001101010111000111100001101010100110000101101101101111100000001011110101101111101111001001111101001100001011001001110110110001111101111001111011011001010001010111001001100100010000001011110101011010101010000101110110100010011000100011011011100111110101001100100000100111101100000111101000111010010 0111001110111011000100001011011110100110110000001111001001100110010001101000110110101100110100100101101010011011000110110010110010001000000000000101001011010000010111001011110010010010000000001101110101101101011011101100010111010011011000101010100000100010111001101101000001011010011011000011100111110000100101110010101011000010110110000001100100010000010000000000000101010110001000010111111111001001 0101010100110010111100101101011110000000110010011001110111100011111101100010001000111011111010010101101110100001100110101111100010010110010100010000001011010100111100010010110000110000111001011011010101110111011100101000101100110010100011101000101011101110111101010101011101110110000010110100001111000001010111000001000010010011110000001000101000101011001011001010100001100101101100000100000101001101 1110100100110010111110110110000111011110101011010000011010011011111001001010001010100100011011000111001110110111111100000011010001010111000010010011100100110011100111000111001011100000010110001111101110100101000100010010110001000000000010100010001101011110011001100110101000001000010011111011001010100100000100110010101110110011011011100011110111001001010001100001100101010001000101000100010110101001 0101001100001101000111001011101100010111001101000001001011010001100100001101100001101111111010000101101000111110011001111010111101010000011001100101000000001111110110011010000101111010001011111001111011010011001001110000110011011001111010100011101101000110001110111001100111100010100111010101010111110110101010000110000110001000001100111001010111101100100010001110011101111011000000011001110011100111 1000111101111101101001010110011101100111001001001111001001111110101110100100101110111111001111000001001111101000000101111010010001100101001100011001111101001110101001101100011001100110110011010011100011010101011101111111101101111110100010010001011110110001001100111101110011110000001110001100100110100011110100010001111110001001100000010000101011110110110111101111001111111110000110100100100010011010 1011101011100011100000011111111000100100110000101001011011111100000011010001000100010011111001010110101101101111100001000011000001110110110000111100000010001000011000010000001001000001000011101001011100010100111111111101101111100010111110001011001110100100100111011101010000001010001101110100001101101100001011001000110011101000110111001111010101011111100101111010100101010101110000010000101011001000 0001100011000001110110111110010011110100001101011001000011010011100010111101101101011011010100110010000111100101110010111101000001100010000011100011001100100010000111001100010110000011000001111011100111101100100111110011011011011011000101101110001011110011010100000100101111110000001011011000000011110111100111000001010000000001010110000100011010010110101100010100100111100001110101000000001001000011 1011100111001000010011010000000101011000010000111011001011100100000000101010101010111010001001001101011101110100110111010110000101110010110001010010110100101100101101000001110100111000001100101100010001001001111001100101010100100111101100101101011010111000111011110010001000111011110111011100100011001101110111101000000011011101101111010110010111101110100001101001011110010011110000111111011101111011 1110100111000101110100110001011001000110011100000110101100000100101010010011011111101011000000100000110110100000100010011001010100001010101110011111111100100010110111100010110011110001001111101111100100010011100010111010100110010010010000001100110011010100011111111010001001101101111010011110100000011010010111000101011101001001100001000010000100100100110000011110001100010010111111011010111110010110 1011100011111010101111001111101011010100010000101001101100000010101011101101000111000100010110011001011000000011011011010100111010110000010010111011011110110101100000101101000011101001011111100010000010110110100110000011101100100011001010101010110001010110001100100000011001010101000001100111100010010100100000111111001010100000000110110100001011001100000000000110010001001011000010011010001000001011 1000101011101111011100101001111001100100110001110100100111000100011100011110011000010101100111101001000101101101001111000010100111000100110111001011011100001100111011110111011001001110011000001100111101001010101110100000100011001111011110000110110110011110011100001101110111111001111000001000111011111010010010101011100110001011100001001100110010100100100110011011110001011001111010011010000101100101 1111100100111000000111111100110101111010000010000001100111001111101011011110110010111101100100101000001011111001110111011111000011011100010110011100110001101111100111101111101001010010011101110101100001110001110110000101100011010100110100011110111101000101000111011100110101111000101101001101110111010111010000100001011101000010110010111100110100011000101110111110000010100100110110100001110100001101 1110100001011001111010111101000000110010011101101010110110000101010111001100000011101111101110010011100011100001111001010011100011011011000000010000101111001100001011110100110001011110000111010111011010101110100011110101100100011111101111110100001101110110001010100011111001000101100011100110010010011111001010010000111110010000111110111011101011011000110111010010010000100000000111010101111101001101 1101100110010100111110100000100001100111011100001011010001000001000110101101001000110010100010110010000010011011101110110111010001110010000010100011001011000100011010010101001001100001001110000110010011000110000010011000110010110000111111011001000011101100001101000100100001111011001011010000111101101010000000000111010011111110001000000111011011101100100010101000011111010010011100111100010001010111 0111111000001000001111100111101011111011011111011001011110011101101110110000011011110101111100111110010111100100101101100001110011011011000010010111000110011010000111100101100110001110000101000010100111110011011011001010011101010001010110111001000000100101001011001000110110001110001011100010101101110001010001010001000011111000010100011011101100001100011000000001111010101000100100100111010101101001 0101111100011110100110010010110111111000101000010010111001100100000100011101111011010001100111101110001100000000110110101011010001110111000110011000111100100000001110110101010010001010110100101100010000001011111101101111011101010011010000001101101111000111001000011000000010110110001010100100000110000010110110110101001011100111100001110011101101011010111101101001111011000001001110000111001110001000 1001101111111001010011000101001001010010111111110011010100111110000010001111111000101100000110011001000010101011111111000111100110101111000000100001111011110110110001110100110001101110001110101000001111110010110011001101011000100010100100010010011110111110111010011101101111001010100111100001010101011101110001010111010100000110101100010100010110110110001000111110101010000111100110111101100001000111 0100011110010100101000010010110011110101110110111011101100110110110011111110000100111101011000110110000010011011100111010001100000001001011011101011110110111101101111011101100000000000000100100011100000011010100000110101000000011101000001101010100000100001101111001001011010011001011011100000011010000000110001110110010100110001111100101110011111001110110110010011111001100000100110101011100000011110 1001000001011100101111111110011100011000110110010111101010011100000110101110100110100011110010100100101001110111001101000111010010011001001100110100110000111111001011111111001101111010110100100000011110010000001000011110110110011011101100101110000010000100001010101011101111000001110110011011111011011001011001001010000001110110010100101010101001001110011001000111101100111010010010000111011111110010 1001100110011110010011001101100001101100000010010110100001001011110110101111101111110001111010000111001011001000000000110111000001110110001011010001100010010110001100000000110111100011110000001100011101010011100010110110110100100111101101010100101110111101010000101011000011110111010100011011000000100100010110000001000001100111010000100100000011101010101011100111111101000101011011111110110111010111 1000111101111100011000011111101111000111011110110011000001110001011011100110110000110110011110111111011000111010101101111111010000000011010101010100101100001000001110100000001111110000011000111011100110001000010101011110011111001010101100000011010011110001110001110000101001100010000101101111101111001000100010101000111111101100100011111101011100110011010100010111110110100111111011010110010100010101 0111110110101001001001011011101011000100010011010010010101111110010101010110100011100010100010000010000001001010000010001011111111000100000000110001101101000000101110000101100100010110001001000010010111000011001010010011100010001101111001111010110111011011011110101001001101011001110001111011001010010110010000110010001010000001101011100001110011100111111111010111001110010110100011100011110101010000 1101100000000001010100011010010111001000000001100011101011110000101100100101111001000101010111010011100011110011011000101001000011000101001001000000100011111111000101011110100111101010011101101111010010001010110000000011101000110111001000010111001111010011101011100000000100001001011000100101000010111101101101101001101011010001101000110100010111100000000100100101111101001000111010100100001111100011 1000101101101010001000011000100110111010110010110110101100111110001111001011011010000010110010011110010101011110111110110110010011111011011000011010111110101100000001100011011001101111110100001000000001110011001011001001000110000110100110100000010101000000110101101001000110011101111000111110101000101011011101011101100010001111001001011001111001010010000010111110100100100000010011011011001010101011 0011010101101111001111100001110001111111001011010011011001011111111011001101101110010000010000010100100011011010000110111100011110110000100111000101001111110010100111101010011111010001000111000101001110100111101000001111100000111100001111010100011011110100000110111011111010110000001111100101011011111001000000010101000010111101010111000101010100101100111010001010101001011010111110100010000011011111 1111110100000000010001001011010101100100101011110110011001100001101000101111000010000010000001111101001011000111010111100100111010100111101010000000011100010001010111000100110000110111101111111111110001011011001101110110101001100010000010101100101111111010101110100001111011110100111010110100001000011111110110110111110001000110111110110001001001101100010000111000100011010111100010100000101010001111 1011001111010100100111101000100111100111101100000111000010111110001010101011101101011111101111010010011101001000011110111110101110010001110101001011101011111110111000111100101111110101101000001111001011011111010100011110011110101011011010011101010010001011110010100110001111110000101100000111010111100000111010000001011100111011101010100110001100000111001110101110001010010001011000011010011001001101 0111010111010111000100000001000100010110110111011110001000011000010111101000011001010001000010001001011111001001011101010110100110000001011111010010001111110101001010110001000100011111010000111010000011000010000000101011101001001101011001001100100101101110100101111011101001100111100111011011010110100000010110010110000011111100000010111011110110011000101110101010000010111101110100111011001010010111 1001101011101011000000011011110010000111001000010101100100001111000110101011010011110111011110110111100000010000011100011000110001101101011011001001110111001000100111010011101110001111101011101010110110000010101101001110101101101110111000111001001111000110110101011011111101111110011110001111001111100000010010000011010010010101111111010001000101111000010110010100110000110100011001001100101111111001 0000011000010111000110110001111110000001111000001100100001110000000110001110011000101110100011100100010000010011110111011110010000001000011000101110110100100001000011000000010110100110011111011110010110111011011010101110010000101000010000111100100110010001111001111111111000100110000101010111011000100110111110010011100011011011011101000011001000111001001110011110111000101000101001111010111110111011 0101000010011000101010101011110011011010010100111101100001010101100010010011110101100000010000101010101101110001101000101100100111000111001010001000101000001110100011011010100010000111110100101101100111100000011111111100101100110111100101000001011010010010100101000001100000111000111000011110010110100010000111101100101001100110101110011101010100100011100010001010011100001111011010000010010000000001 1100111100001110000001101100110010000011101111010110001010101100110010111011100011111101111101101010100100101110010111000101000101100110110000110111011111101010000001111001000100001101000101101011001100000011011101101001101110011001011110001001101011110100100111110010101100110011100000101011101000011111110000010010011110101100000001100001110010101110001000111010100000001110101010010000110101111011 0000101000100100011110011111001000001000110011010101000001001100111001001110010011110001111110000011100101101010101111000000000101000010010101000000100001011001101001000101100001110000010111111101111011100111000111010011101100000110110111010111100000010001011011101001001101110011010011111111010101110000001010100000011110100110100011110101010011101100001011111110110111101000001000110010110011000010 1011110111011111111001110011110001001011110101111001111101000101101110100100111000000101100101111100001110101001101000001111111011010100011000010111111110001000001101111011110001100100001001110001010001011011001110110111010001111010111001011001010111010011100110000010111001110111101001010100111111101001011111010000001010010011000111100001011110000010001010101101010001011100011100101100011000001101 0100010111011101001010001110011100100110100011001101110111010001101011101000101100111100100101101111000010000111101110110110101010111110100101010100000100110000110001000110110110010110010001111011001010000000011010001100001001010110100001001001010000001111100000010011111011111101000101101001011110011101001100011011110110111100101111110010010000011000111011110110100011011010100111010111000110100011 1010000001011010101100011110101000101011010001111100011101011000111100001111010100111111111011111110000010010111101101110100111110100011000100001100110100100010011010100110010011000100101011111110110000000100000011100110110101011111010100101011001001110011000000011101110111111010010011001101101001011111000110101001000100110111001100101111001111110100011101111111011000101101110000111111110010110110 0100100111011110111101100100100110111100010001110111011000100010101001110011110001110100011001101000111000001011000010110110011001011010011101100010001011010110010000011001001011001110010011010010111010011010011011011000101000011010101001001111010111011100110001000110011010100011001111001101111001101111001010001111111001010000110011110100101100000001010001100010100001000111110010100001001010100101 0111111110111011010110010010101010000001110110101001111011101100110110010001001000110001100101000000011000010111111111010100110111001010111101100100110000010100111001001110101000111000011110101000001100010001100101010111101100000011010000111000010101110110110111110100000101101000011000001000010111110111000000100001111100100111001000000100010011111100111001010110110110111000000001011000101111011001 1000011000000111100110010010010000000001010001011011100100010010010010110101011011010011000100011110100111000101001011100010010000100101010111100111001100100010101000101101111000011010111001101011010010100101011101011100000101001001011111011100011010000010111000100110111101101111011010111110100110011101000110010010100110000010011010101001001010011101000000101101100101110101111101010111101101111010 1011101000101110101011100011100001000000001010100110010000110111100000101000000011000100010111100000010101110100110001111000101110010001111000000001001011101110100101011011011011000001010011100101110011100010101101101000010100011101001110010010010000100111111111010000100111001010010100110011010010011101100000001001010011111100100010101111000111100011011100011111001001010000010010110011100011100100 1011110001101000010010000110010010000110101110111110100100001011111001000001101011100111001110000001110010101111000110011000001111100101010110010000000011000101100011111101010011010101000110000111100100100100111001011111001111101001001111101000111101001000011001000010010101111111000011110000000000101110010001111101001010011000010100011011100001111000010000001010011101110001110110011011100011011011 0110001000101111010110111110000000011010101101010011111011101101110011100110110000000001111011011110100000010101010101011000011111101000111010101100000110110010010011010101011110100111001100100011111001110110001011011010000110011101011011111110100110000001111000110101000100110111000001100110000100111111001111011001011011110111101010110000100101100000000011111111011000101101000000101010110100010110 0000000000110001110010011110010100000010110000110101001111010011000010010111100110111101101101110101011110011101110111100011100101000011100110001011001111111110001001010111111011100100101000101011001001100000100111001111010011011110111110111010000100000110001001011011011000010000110001111000011111011001110000000101011110110101100010100000000001110001011010111010100110111100101101011011011000000010 0001011011111011101100101101101001101100010100101001100100011101001101111111100001101001111100110000101100100000100111101101111010001001000100000100100111110000010010010011001010010111111100111000011000000011010100011011010111001101000001100011011100111001111010101001111111100101000110000010111011101001110101000000100011110110100100000010011011101000100000010011111001100101010010010000011100101001 1010111001001110111110011100100110001001111000001011111000110111011001101101110001101110000011001111001000000011100001101000110110001101011110110101101000101100001111110001111011011011101001100111010001001101011101011101110110000001010001000001010101110100000010111001101010011101011011011011011000000110010100110010010011110100101110000111011010001100001100010100100110111100111000001111010110001001 1011100010000101100010110111000110011101000110010100101011001100100001011010001011111011000101011000111111101010100110000000110101010011100010011100100000001111001001100010001110010000101001001111100110100110011001011001000000011000010010001101000100011000100111010100100000100011101100000011101101111110100011000111001001011001000101110111110001111000110101110010011110001010110001011000111011001000 0000011000100000010001100100010111100110110100110000001101000111010001001010100111001100000111100000111101111001001001001011100010100011011110111101010010111111110001110001000101001001110111010100100011000111101010011110111110110001100101010010100111011001001110011111000110010010011010111000101000010010000100101100100111011111010000001000100111011010100010100100010100100101000100010011010101101111 1101011000000111010100011101000100110101010011110000101110111101000001001011010001101000010101100011101101010101001101001111111110000101001001110000110101001110000011011101010101000110100010111011010110111110000101000001101011010100000100111101110101010011100101010000101010010000000101100111001011100100001000001110110101101110010100001101101110000000111000000000000100101111000010101110101000000111 0100010100100011111101010110100101101000001111000100110111001101100010001011011010101000001101101000110010011011101001000010001001111111000110110000010011110010011110100000010010001100011110100110001001010110001001100100100100100001100110110001000101110011011011011111100111111111101001110001111111101011001111010001000010011011100111010001101101100000111000010111010100110001000110011010010100111110 1010101101111000111100100101010111000110100110101110000011110010011001101110000000010001100111111110100101011100000110101000000001110101111011101100011000110000001111010001111001101111110010100011010110001011100001111110011010010010001010101110100011101011111110111101011011101000000010111101010101100111001001011001011000110010001001010110111101101111010111001011101110010011001011110111100000011101 0011110100110101100110110011001111110001000000000101100010101010000011000011101010101100100110100100010000011110001010110001011101111110011111100101001111011111101000011110011000111100101111001101111011110001011110111111111010011100111100011011010110110110010001010111010100111111110101001001110110101010010010010000110110110000011011110001100111110011001111110111011110110000001111101100101011011011
cTrader Algo

【cAlgo】過去のBarsやTicksのロードする【Tips】

4/7/2021

5年以上前の記事です。内容が古くなっている可能性があります。

LoadMoerHistory

もっと昔の価格情報を使いたい

cBotやインジケーター内で最初に読み込まれているより昔の価格情報を使いたい場合はBars.LoadMoreHistoryメソッドで明示的にロードしてあげないといけません。

少し前の情報なら1回BarsプロパティのLoadMoreHistoryメソッドを呼び出すだけでいいのですが、ずーっと前の情報となるとこんな感じでループ回して呼び出すことになります。targetDateTimeに欲しい日時が入ってると思ってください。

var count = 1;
while (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1 ||  count != 0) {
    count = Bars.LoadMoreHistory();
}

Bars.OpenTimes.GetIndexByTimeメソッドは対象の時間がBarsにないと-1を返すので、Barsにない場合は延々とLoadMoreHistoryを繰り返させるコードです。

ただ条件式がこれだけだと、最後まで読み込んでも対象の時間のデータがなかったときに無限ループになってしまうので、LoadMoreHistory()で読めるデータがなくなった時点でループを抜けるようにしてます。

LoadMoreHistoryメソッドは追加で読み込んだローソク足の本数を返しますので、これが0を返した場合、これ以上のデータはないということになります。

このコード自体は問題ないのですが、ご想像のとおりものすごく時間がかかります。たぶん知らない人が見たらフリーズしてると思うでしょう。自分で使うにしてもフリーズしてるか処理中かわからなくなるのはあまり好ましくないですよね。

 

ロード中であることを示したい

これをやるならチャート上にロード中である旨を表示させておく方が親切でしょう。ついついこんな風に書きたくなってしまうかもしれません。

var count = 1;
while (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1 || count != 0) {
    count = Bars.LoadMoreHistory();
    Chart.DrawStaticText("loading_text", "NowLoading..." + Bars[0].OpenTime.ToString(), VerticalAlignment.Center, HorizontalAlignment.Center, Color.White);
}
Chart.RemoveObject("loading_text");

1回読み込むたびにチャート上に1本目のバー(読み込んだ一番昔のローソク足)の時間を表示させようとしています。が、実はこれでは何も表示されません。

DrawStaticTextで追加したテキストはcTrader側に処理が戻ってからチャート上に表示されるのです。このコードだとロード中は処理を戻さないため、ロード中のテキストは表示されずに、ロード終了後に消されてしまうのです。

なので、読み込むたびにテキストを表示させたり更新させたりしたい場合は、一度読み込むたびに処理を抜ける必要があるのです。非同期メソッドの出番ですね。

 

LoadMoreHistoryAsync

非同期ローディング

非同期でロードさせることのできるこのメソッドは処理が終わり次第実行するコールバックを引数に指定することができるため、これを利用して連続読み込みを行います。

具体的にはこんなメソッドを用意してあげるといいでしょう。

private void LoadMoreBars(DateTime targetDateTime) {
    Chart.DrawStaticText("loading_text", "NowLoading..." + Bars[0].OpenTime.ToString(), VerticalAlignment.Center, HorizontalAlignment.Center, Color.White);
    Bars.LoadMoreHistoryAsync(args => {
        if (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1) {
            if (args.Count != 0) {
                LoadMoreBars(targetDateTime);
            } else {
                // 全部読んでも欲しいデータがなかった時の処理
            }
        } else {
            // 欲しいデータまで読み終えた後にする処理
        }
    });
}

使い方は欲しい時間を指定してMoreLoadBarsを呼び出してあげるだけです。

動きとしては

1.MoreLoadBarsが呼び出されたら、チャートに状況テキスト表示して非同期でLoadMoreHistoryして処理終える。

2.LoadMoreHistoryが終わり次第、コールバックが呼び出され、目的のデータがあるか確認される

3.データがあるか、全部読み終えてもなければelse内に進む。再読み込みが必要なら再度MoreLoadBarsを呼び出し、1に戻る

この場合は1が終われば一旦cTraderに処理が戻るため、ロード状況を示すStaticTextが表示されるようになります。

 

 

Ticksでも同様だが要注意

Ticksデータが欲しい場合はまず最初にこんな感じでMarketDataプロパティから取得します。

var ticks = MarketData.GetTicks();

これで取得できるのは直近のTicksデータのみですが、あとはBars同様LoadMoreHistoryメソッドで過去にさかのぼって読み込みが可能です。

ただし、Tickは数が多いため、昔のデータが必要な場合は非常に時間がかかります。残念ながら特定期間だけ読み込むということはできず、常に現在のデータから過去にたどっていく形となります。

そしてここが一番要注意なのですが、途中で接続が切断されるとReloadが発生し、最初からやり直しになるようです。

どういうことかというと

var ticks = MarketData.GetTicks();
var count = 1;
while(count != 0) {
    count = ticks.LoadMoreHistory();
}

このコードは無限ループになる可能性があるということです。

実際サーバーにあるTicksをすべて読もうとしたら丸一日近くかかると思われるため、サーバーが安定してないと結構な確率で無限ループになります。

このような理由からLoadMoreHistory()で何年も前のTicksデータを取得するのはやめておいた方がいいでしょう。

 

 

過去のTicksデータを使いたいときはどうするか

「バックテスターのデータをPCに保存して使えばいいじゃん」

というのが公式の回答のようです。

どういうことかというと、バックテスト上のcBotでGetTicksを呼び出すと、そのバックテスト内時間のTicksデータが返ってくるのです。これを利用して

①内部でGetTicksして読み込んだTicksデータをローカルに保存するcBot作る。

②そのデータ保存用cBotをTicksデータが欲しい期間を指定し、バックテストで動かす。→ファイルが出来上がる。

③別のcBotから保存されたファイルを呼んで使う。

ということですね。言われてみれば確かにこうすれば可能ですが、ただ、配布するプログラムではちょっと使いにく方法です。ユーザー側でTicksデータ保存作業もやってもらう必要が出てきますし。

やっぱり特定期間のTicksデータだけ取得するメソッドが欲しいなぁ・・・


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2026 ajinori